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

SQL トリガーは INSTEAD OF DELETE を実行できませんが、ntext、image 列には必要です

    INSERTED または DELETED から TEXT、NTEXT、または IMAGE フィールドにアクセスすることはできません。ただし、INSERTED で結合することにより、ベース テーブルからそれらにアクセスできます。 DELETE ではベース行が存在しなくなるため、これは INSERT と UPDATE でのみ機能します。

    必要なことを実現するには、別のトリガーで、主キーと TEXT、NTEXT、および IMAGE 列をサイド テーブルにコピーします。

    例えば

    create table C1(
       accountNo int identity primary key,
       someColumn nvarchar(10),
       someNtext ntext
    )
    
    create table C1_side(
       accountNo int primary key,
       someNtext ntext
    )
    
    create trigger trgC1_IU  on C1 AFTER INSERT, UPDATE
    as
    BEGIN
       -- Ensure side row exists
       insert C1_side(accountNo, someNtext)
       select accountNo from INSERTEd
       where not exists (select 1 from C1_side where C1_side.accountNo = inserted.accountNo)
    
       -- Copy NTEXT value to side row
       update C1_side
       set someNtext = c1.someNtext
       from C1_side inner join C1 on C1_side.accountNo = C1.accountNo
       inner join INSERTED on INSERTED.accountNo = C1.accountNo
       -- Could improve by checking if the column was updated for efficiency
    
    END
      

    これで、DELETE トリガーで、DELETED を C1_side に結合して、ntext 列の前の値を読み取ることができます。 C1 に既に存在する行については、サイド テーブルの初期値を入力する必要があることに注意してください。



    1. MySQL:クエリからの情報を使用して新しいテーブルを作成する

    2. 日付/時刻からSQLServerの文字列の例へのCONVERT()

    3. 行から列に存在するデータ

    4. oracle.sql.ARRAYオブジェクトを作成するにはどうすればよいですか?