Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

SQL Trigger non può eseguire INVECE DI DELETE ma è richiesto per ntext, colonne immagine

Non puoi accedere ai campi TEXT, NTEXT o IMAGE da INSERTED o DELETED. Tuttavia puoi accedervi dalla tabella di base unendoti con INSERTED. Funziona solo per INSERT e UPDATE perché in un DELETE la riga di base non esiste più.

Per ottenere ciò di cui hai bisogno, in un altro trigger, copia la chiave primaria e le colonne TEXT, NTEXT e IMAGE in una tabella laterale.

Ad esempio

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

Ora, nel tuo trigger DELETE, puoi unire DELETED a C1_side per leggere il valore precedente della colonna ntext. Nota che dovrai popolare i valori iniziali per la tua tabella laterale, per le righe che esistono già in C1.