sql >> データベース >  >> RDS >> Sqlserver

SQL Server 2005 で BEFORE DELETE トリガーをエミュレートする方法

    INSTEAD OF トリガーを使用できます。実際の削除の前に発生する (置換する) ため、[one_two] 内のリンクされたレコードがまだ存在している必要があります。

    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
    

    いくつかのサンプル値

    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
    

    今すぐテストしてください

    delete two where two_id=13
    



    1. Oracleで昨日の日付を取得する方法

    2. PostgreSQLデータ比較ツール

    3. PHPでSQLの結果をループする-配列全体を取得しない

    4. SQLエラー:ORA-00913:値が多すぎます