Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

O SQL Trigger não pode fazer INSTEAD OF DELETE, mas é necessário para ntext, colunas de imagem


Você não pode acessar os campos TEXT, NTEXT ou IMAGE de INSERTED ou DELETED. No entanto, você pode acessá-los da tabela base juntando-se a INSERTED. Isso só funciona para INSERT e UPDATE porque em um DELETE a linha base não existe mais.

Para conseguir o que você precisa, em outro gatilho, copie a chave primária e as colunas TEXT, NTEXT e IMAGE para uma tabela lateral.

Por exemplo
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

Agora, em seu gatilho DELETE, você pode unir DELETED a C1_side para ler o valor anterior da coluna ntext. Observe que você terá que preencher os valores iniciais para sua tabela lateral, para linhas que já existem em C1.