sql >> Databáze >  >> RDS >> Sqlserver

Smazat záznamy v rámci spouštěče namísto smazání

Tato metoda by měla stačit. Místo spouštěče provede vše, co určíte, namísto automatického mazání. To znamená, že je klíčové, abyste v něm provedli smazání ručně, jinak se záznam nesmaže. Nepoběží rekurzivně. Lze to provést pouze na stole bez povoleného mazání kaskády. V podstatě je trik v tom, že se připojíte k původní tabulce v poli id, abyste získali data z pole, ke kterému nemáte přístup ve smazané pseudotabulce.

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

Pokud můžete změnit pole na varchar(max) nebo nvarchar(max), je to nejlepší řešení. Text a ntext jsou zastaralé a v příští verzi by měly být ze serveru SQL zcela odstraněny.



  1. Replikace mezi SQL Serverem a MYSQL

  2. SQLskills Wait Types Library nyní zobrazuje data SentryOne

  3. Postgres rozdělit řetězec s dvojitými uvozovkami na více řádků?

  4. Jak se připojit k databázi pomocí klienta Workbench MySQL