0

うまく動かないデータベース トリガーについて助けが必要です。開示:私はDBAではなく、専門知識を主張していませんが、これを成し遂げる任務を負っています..

そうは言っても、問題のステートメントは次のとおりです。

更新/挿入/削除を追跡するいくつかのテーブルを含むデータベースがあります。トリガーは、いくつかの列の「前」と「後」の値をキャッチし、両方をいくつかの追加情報 (後述) とともに取得して、versioncontrolテーブルに追加する必要があります。

さまざまなサイトで入手できるチュートリアルやその他の情報に基づいて、機能すると思われるものをまとめましたが、トリガーを作成しようとして何をしても、常にエラーがスローされます。

メッセージ 311、レベル 16、状態 1、プロシージャ tr_taskconstructs_U、38 行目
'挿入' および '削除' テーブルで text、ntext、または image 列を使用することはできません。

トリガーを適用するテーブルの列レイアウトは非常に単純です。

ResourceID (PK, nvarchar(38))
AML (ntext, null)

次のように、列への変更をキャッチし、その変更をテーブルに挿入したいと考えてAMLいます。

id (int, not null),
ResourceID (nvarchar(38)),
TableName (nvarchar(50)),
DateTime (datetime),
Type (varchar(20)),
Before (ntext),
After (ntext)

私のコードは次のとおりです。

CREATE TRIGGER tr_taskconstructs_U ON taskconstructs AFTER UPDATE
AS 
BEGIN

SET NOCOUNT ON;

    DECLARE @before nvarchar(max), 
        @after nvarchar(max), 
        @resource nvarchar(50)

IF UPDATE(AML)
BEGIN
    SELECT @before = d.AML,
            @after = i.AML,
            @resource = d.ResourceID
    FROM inserted i
        INNER JOIN deleted d on d.ResourceID = i.ResourceID

    INSERT INTO versioncontrol
    VALUES (@resource, 'taskconstructs', GetDate(), 'Update', @before, @after)

END

END
GO

上記のエラーで常に失敗します。変数のデータ型などを変更してみましたが、同じ結果でした。ほとんどすべてをコメントアウトしようとしましたが、同じエラーもあります。明らかに何かが欠けていますが、何がわからないのですか。

どんな助けでも大歓迎です。

4

2 に答える 2

5

代わりに nvarchar(max) データ型を使用するようにテーブルを変更してください。Ntext は非推奨であり、今後は使用しないでください

于 2013-06-27T18:29:06.753 に答える