sql >> Databasteknik >  >> RDS >> Sqlserver

Ta bort poster inom utlösaren istället för radera

Denna metod borde göra susen. En istället för trigger kommer att göra vad du än anger istället för att ta bort automatiskt. Det betyder att det är viktigt att du tar bort den manuellt, annars kommer posten inte att raderas. Det kommer inte att köras rekursivt. Det kan bara göras på ett bord utan att kaskadborttagning är aktiverad. I grund och botten är tricket att du går med i den ursprungliga tabellen i id-fältet för att få data från fältet du inte har tillgång till i den borttagna pseudotabeln.

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

Om du kan ändra fältet till varchar(max) eller nvarchar(max) är det dock den bästa lösningen. Text och ntext är utfasade och bör tas bort helt och hållet från SQL Server i nästa version.



  1. Konfigurera Django med GeoDjango Support i AWS Beanstalk eller EC2 Instance

  2. Varför visar COUNT() bara en rad i tabellen?

  3. RMySQL dbWriteTable med field.types

  4. OVER-klausul i Oracle