Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

SQL Trigger ne peut pas faire INSTEAD OF DELETE mais est requis pour les colonnes ntext, image

Vous ne pouvez pas accéder aux champs TEXT, NTEXT ou IMAGE à partir de INSERTED ou DELETED. Cependant, vous pouvez y accéder à partir de la table de base en joignant avec INSERTED. Cela ne fonctionne que pour INSERT et UPDATE car dans un DELETE la ligne de base n'existe plus.

Pour obtenir ce dont vous avez besoin, dans un autre déclencheur, copiez la clé primaire et les colonnes TEXT, NTEXT et IMAGE dans une table secondaire.

Par exemple

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

Maintenant, dans votre déclencheur DELETE, vous pouvez joindre DELETED au côté C1 pour lire la valeur précédente de la colonne ntext. Notez que vous devrez renseigner les valeurs initiales de votre table annexe, pour les lignes qui existent déjà dans C1.