sql >> Database >  >> RDS >> Sqlserver

Records verwijderen binnen in plaats van trigger verwijderen

Deze methode zou het lukken. Een in plaats van een trigger doet wat u opgeeft in plaats van automatisch te verwijderen. Dit betekent dat het belangrijk is dat u het handmatig verwijdert, anders wordt het record niet verwijderd. Het zal niet recursief worden uitgevoerd. Het kan alleen worden gedaan op een tafel zonder cascadeverwijdering ingeschakeld. De truc is in feite dat je lid wordt van de originele tabel in het id-veld om de gegevens te krijgen uit het veld waartoe je geen toegang hebt in de verwijderde pseudotabel.

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

Als u het veld kunt wijzigen in varchar(max) of nvarchar(max), is dat echter de beste oplossing. Tekst en ntext zijn verouderd en zouden in de volgende versie volledig uit SQL Server moeten worden verwijderd.



  1. Postgres hiërarchische (jsonb) CTE onnodig traag

  2. Binaire boom met PHP + MySQL

  3. Gegevenstype voor het opslaan van ip-adres in SQL Server

  4. Moet records in de orakeltabel invoegen voor planning