sql >> Base de Datos >  >> RDS >> Sqlserver

SQL Trigger no puede hacer INSTEAD OF DELETE pero es necesario para ntext, columnas de imagen

No puede acceder a los campos TEXTO, NTEXT o IMAGEN desde INSERTAR o ELIMINAR. Sin embargo, puede acceder a ellos desde la tabla base uniéndose con INSERTADO. Esto solo funciona para INSERTAR y ACTUALIZAR porque en ELIMINAR la fila base ya no existe.

Para lograr lo que necesita, en otro activador, copie la clave principal y las columnas TEXT, NTEXT e IMAGE en una tabla auxiliar.

Por ejemplo

create table C1(
   accountNo int identity primary key,
   someColumn nvarchar(10),
   someNtext ntext
)

create table C1_side(
   accountNo int primary key,
   someNtext ntext
)

create trigger trgC1_IU  on C1 AFTER INSERT, UPDATE
as
BEGIN
   -- Ensure side row exists
   insert C1_side(accountNo, someNtext)
   select accountNo from INSERTEd
   where not exists (select 1 from C1_side where C1_side.accountNo = inserted.accountNo)

   -- Copy NTEXT value to side row
   update C1_side
   set someNtext = c1.someNtext
   from C1_side inner join C1 on C1_side.accountNo = C1.accountNo
   inner join INSERTED on INSERTED.accountNo = C1.accountNo
   -- Could improve by checking if the column was updated for efficiency

END

Ahora, en su activador DELETE, puede unir DELETED a C1_side para leer el valor anterior de la columna ntext. Tenga en cuenta que deberá completar los valores iniciales para su tabla auxiliar, para las filas que ya existen en C1.