ver una tabla restricciones restriccion para estructura ejemplos descripcion comando columnas check sql sql-server sql-server-2005 triggers

una - Crear desencadenador para insertar un valor de columna en otra columna de la misma tabla SQL Server 2005



restricciones check sql server ejemplos (4)

En su activador, debe actualizar ColumnA solo si ColumnB no es NULL.

Use lo siguiente:

CREATE TRIGGER inserupdate ON triggertestTable AFTER INSERT,UPDATE AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; -- Insert statements for trigger here declare @id1 int select @value=columnB from inserted if @value is not null begin update triggertestTable set columnA=@value end END GO

Cómo crear un desencadenador para insertar un valor en una columna igual que el valor de otra columna de la misma tabla de una fila recién insertada en la tabla.

Supongamos que tengo una tabla como a continuación

ColumnA | ColumnB

Quiero que el valor de columnB se inserte en ColumnA tan pronto como la fila se inserta en la tabla o el valor de columnB se actualiza. Pero no debería ser al revés, es decir, insertar el valor de la columna A en la columna B

.Los códigos de código manejan solo INSERT, ayúdenme a manejar tanto la inserción como la actualización de la tabla, es decir, cuando se inserta o actualiza el valor de columnB.

CREATE TRIGGER inserupdate ON triggertestTable AFTER INSERT,UPDATE AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; -- Insert statements for trigger here declare @value int select @value=columnB from inserted update triggertestTable set columnA=@value END GO

Esto funciona bien si los valores se insertan como a continuación

insert into triggertestTable(columnB) values(''xyz'')

El valor ColumnB se inserta en columnA

ColumnA | ColumnB xyz | xyz

Pero el valor nulo se actualiza en ambos si alguna otra aplicación inserta valor en la columnaA

insert into triggertestTable(columnA) values(''pqr'')

Ahora los registros son

ColumnA | ColumnB xyz | xyz NULL | NULL

El conjunto de registros correcto debería ser como a continuación

ColumnA | ColumnB xyz | xyz pqr | NULL

Cómo resolver este problema.


Has intentado lo siguiente:

update triggertestTable set columnA=@value where columnB is not NULL


Pruebe este disparador (copiará los valores de ColumnB a ColumnA cuando se inserten valores en ColumnB o cuando se actualicen los valores de ColumbB):

CREATE TRIGGER trgIU_triggertestTable_UpdateColumnAWhenColumnB ON dbo.triggertestTable AFTER INSERT,UPDATE AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; IF UPDATE(ColumnB) BEGIN UPDATE dbo.triggertestTable SET ColumnA=i.ColumnB FROM inserted i INNER JOIN dbo.triggertestTable t ON i.MyID=t.MyID LEFT JOIN deleted d ON i.MyID=d.MyID WHERE d.MyID IS NULL AND i.ColumnB IS NOT NULL -- Row was inserted OR d.MyID IS NOT NULL -- Row was updated END END GO

Usé esta tabla:

CREATE TABLE dbo.triggertestTable( MyID INT IDENTITY(1,1) PRIMARY KEY, -- MyID should be a PRIMARY KEY or a mandatory(NOT NULL) UNIQUE constraint ColumnA VARCHAR(100), ColumnB VARCHAR(100) ); GO


inserted es una pseudo-tabla y puede contener múltiples filas. Deberías escribir algo basado en conjuntos. Algo como:

update triggertestTable set columnA=COALESCE(columnA,columnB) where id in (select id from inserted)

(Si triggertestTable tiene una columna de clave principal llamada id )

Lo anterior establece el columnA de columnA a columnB , si columnA ya no tiene un valor, que creo que podría ser lo que está buscando.