Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL Trigger kann INSTEAD OF DELETE nicht ausführen, ist aber für ntext- und image-Spalten erforderlich

Sie können nicht auf TEXT-, NTEXT- oder IMAGE-Felder von INSERTED oder DELETED zugreifen. Sie können jedoch von der Basistabelle aus darauf zugreifen, indem Sie mit INSERTED verbinden. Dies funktioniert nur bei INSERT und UPDATE, da bei einem DELETE die Basiszeile nicht mehr existiert.

Um das zu erreichen, was Sie brauchen, kopieren Sie in einem anderen Trigger den Primärschlüssel und die Spalten TEXT, NTEXT und IMAGE in eine Nebentabelle.

Zum Beispiel

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

Jetzt können Sie in Ihrem DELETE-Trigger DELETED mit C1_side verknüpfen, um den vorherigen Wert der ntext-Spalte zu lesen. Beachten Sie, dass Sie Anfangswerte für Ihre Nebentabelle für Zeilen eingeben müssen, die bereits in C1 vorhanden sind.