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

削除トリガーの代わりにレコードを削除

    この方法でうまくいくはずです。トリガーの代わりに、自動的に削除を行う代わりに、指定したものをすべて実行します。これは、手動で削除を行うことが重要であることを意味します。そうしないと、レコードは削除されません。再帰的に実行されることはありません。カスケード削除が有効になっていないテーブルでのみ実行できます。基本的に、トリックは、削除された疑似テーブルでアクセスできないフィールドからデータを取得するために、idフィールドの元のテーブルに参加することです。

    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
    

    フィールドをvarchar(max)またはnvarchar(max)に変更できる場合は、これが最善の解決策です。 Textとntextは非推奨であり、次のバージョンでSQLServerから完全に削除する必要があります。



    1. mysqlクエリでのIST時間の使用

    2. EntityFrameworkカスケード削除

    3. DAYOFYEAR()がMariaDBでどのように機能するか

    4. MYSQL:レコードがすでに存在する場合はレコードを挿入します更新レコード