Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Wyzwalacz SQL nie może wykonać INSTEAD OF DELETE, ale jest wymagany dla ntext, kolumn obrazu

Nie możesz uzyskać dostępu do pól TEKST, NTEKST lub OBRAZ z pozycji WSTAWIONY lub USUNIĘTY. Możesz jednak uzyskać do nich dostęp z tabeli podstawowej, łącząc się z opcją WSTAWIONA. Działa to tylko dla INSERT i UPDATE, ponieważ w DELETE podstawowy wiersz już nie istnieje.

Aby osiągnąć to, czego potrzebujesz, w innym wyzwalaczu skopiuj klucz podstawowy oraz kolumny TEXT, NTEXT i IMAGE do tabeli bocznej.

Na przykład

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

Teraz, w wyzwalaczu DELETE, możesz połączyć DELETED z C1_side, aby odczytać poprzednią wartość kolumny ntext. Pamiętaj, że będziesz musiał wypełnić początkowe wartości dla swojej tabeli bocznej, dla wierszy, które już istnieją w C1.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Podziel jedną kolumnę na wiele kolumn, ale dane będą się różnić w SQL

  2. Nawiązywanie połączenia z Script Task (VB) do Menedżera połączeń OLEDB pakietu SSIS

  3. baza danych:klucz podstawowy, klastrowany lub nieklastrowany

  4. Musisz zadeklarować zmienną skalarną @Id?

  5. Łączenie wielu tabel w SQL