sql >> Databasteknik >  >> RDS >> Sqlserver

SQL Trigger kan inte göra INSTEAD OF DELETE men krävs för ntext, bildkolumner

Du kan inte komma åt TEXT-, NTEXT- eller IMAGE-fälten från INFOGADE eller RADERADE. Du kan dock komma åt dem från bastabellen genom att gå med INSERTED. Detta fungerar bara för INSERT och UPDATE eftersom i en DELETE finns basraden inte längre.

För att uppnå det du behöver, i en annan trigger, kopiera primärnyckeln och kolumnerna TEXT, NTEXT och IMAGE till en sidotabell.

Till exempel

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

Nu, i din DELETE-utlösare, kan du ansluta DELETED till C1_side för att läsa det föregående värdet i ntext-kolumnen. Observera att du måste fylla i initiala värden för din sidotabell, för rader som redan finns i C1.



  1. MySQL-transaktion och trigger

  2. Hur kan jag återställa MySQL root-användarens fullständiga rättigheter?

  3. Problem med MYSQL specialtecken

  4. Anslut till MariaDB från Java-applikation i NetBeans på Linux (Mageia)