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

Jak emulować wyzwalacz BEFORE DELETE w SQL Server 2005?

Możesz użyć wyzwalacza ZAMIAST. Uruchamia się przed (zastępuje) faktycznym usunięciem, dlatego połączony rekord w [one_two] musi nadal istnieć.

create table [one] (one_id int not null primary key)
create table [two] (two_id int not null primary key)
create table [one_two] (one_id int, two_id int references two(two_id) on delete cascade)
GO
CREATE trigger t_del_two
on two
instead of delete
as
begin
SET NOCOUNT ON
DECLARE @Statement NVARCHAR(max)
SET @Statement = ''
SELECT @Statement = @Statement + N'EXEC [MyProc] ''' + CAST([one_two].[one_id] AS VARCHAR(36)) + '''; '
FROM deleted
JOIN [one_two] ON deleted.[two_id] = [one_two].[two_id]

PRINT (@Statement)
--EXEC (@Statement)

-- carry out the actual delete
DELETE TWO WHERE two_id in (SELECT two_id from deleted)
end
GO

Niektóre przykładowe wartości

insert into one select 1
insert into one select 2
insert into one select 3
insert into two select 11
insert into two select 12
insert into two select 13
insert into one_two select 1,11
insert into one_two select 1,13
insert into one_two select 2,13

Teraz przetestuj

delete two where two_id=13



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Funkcje zdefiniowane przez użytkownika programu SQL Server

  2. Jak głęboko skopiować zestaw danych i zmienić odniesienia FK, aby wskazywały na wszystkie kopie?

  3. Jak przekonwertować zapytanie oparte na CURSOR na oparte na SET?

  4. Jak uzyskać OBJECT_NAME() z innej bazy danych w SQL Server

  5. Usługa nie została całkowicie zatrzymana po ServiceController.Stop()