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

Usuń rekordy w ramach wyzwalacza zamiast usuwania

Ta metoda powinna załatwić sprawę. Zamiast wyzwalacza zrobi wszystko, co określisz, zamiast usuwać automatycznie. Oznacza to, że kluczowe jest, aby usunąć w nim ręcznie, w przeciwnym razie rekord nie zostanie usunięty. Nie będzie działać rekurencyjnie. Można to zrobić tylko w tabeli bez włączonej funkcji usuwania kaskadowego. Zasadniczo sztuczka polega na tym, że dołączasz do oryginalnej tabeli w polu identyfikatora, aby uzyskać dane z pola, do którego nie masz dostępu w usuniętej pseudotabeli.

create table dbo.mytesting (test_id int, sometext text)
go
create table dbo.myaudit (test_id int, sometext text)
go
insert into dbo.mytesting
values (1, 'test')
go

Create Trigger audit_Table_Deletes on dbo.mytesting INSTEAD OF delete  
as 
if @@rowcount = 0 return; 
Insert into dbo.myaudit (test_id, sometext) 
Select d.test_id, t.sometext from deleted d 
join dbo.mytesting t on t.test_id = d.test_id

Delete dbo.mytesting where test_id in (select test_id from deleted)
go

delete dbo.mytesting where test_id = 1
select * from dbo.mytesting
select * from dbo.myaudit 
Go 

drop table dbo.mytesting
drop table dbo.myaudit

Jeśli możesz zmienić pole na varchar(max) lub nvarchar(max), jest to jednak najlepsze rozwiązanie. Text i ntext są przestarzałe i powinny zostać całkowicie usunięte z SQL Server w następnej wersji.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dostawca OLE DB „Microsoft.Jet.OLEDB.4.0” nie może być używany do zapytań rozproszonych

  2. Nie można połączyć się z SQL Azure za pomocą SQL Server Management Studio

  3. PIVOT z typem danych varchar

  4. Jak znaleźć nazwę ograniczenia w SQL Server

  5. zmień wartość klucza podstawowego