0

私はこれに近づいていると思いますが、正しく理解できないようです。私もたくさんの質問と回答に目を通しましたが、答えが見つからないか、他の人の質問を理解していないので、これが再投稿である場合はご容赦ください.

私がやりたいことは、「代わりに」トリガーのアイデアに関する限り、かなり基本的なようです。私は SQL Server 2008 で作業しています。ビューを直接更新できないため、基になるテーブルの 1 つを更新する代わりに更新トリガーが必要です。問題のテーブルの主キーは Update ステートメントの一部として含まれないため、外部キーを使用して選択する必要があります。

Update ステートメントの Where 句で指定された外部キーを取得しようとしていますが、間違った構文を使用しているに違いありません。基になるテーブルのキーとして使用される可能性が高いため、「場所」の値を取得できる必要があると確信しています。だから、声明を考えると...

UPDATE table1 SET field1 = 'value1' WHERE key_field = 'key_value'

トリガー定義内の「key_value」にアクセスするにはどうすればよいですか? 私は次のことを試しました...

DECLARE @pk INT
SELECT @pk = p_key
  FROM dbo.ptable p, UPDATED u
 WHERE p.f_key = u.key_field

そしてこれも…

DECLARE @pk INT
 SELECT @pk = p_key
   FROM dbo.ptable
  WHERE f_key = (SELECT key_field
                   FROM UPDATED)

しかし、これらのどちらも私にはうまくいかないようです。を使用して更新値を正しく取得していると確信しています...

DECLARE @uValue VARCHAR
SELECT @uValue = field1
  FROM UPDATED

このような挿入または更新に派生した主キーを使用できるようにしたい...

INSERT INTO dbo.xtable (fieldx) VALUES (@uValue) WHERE p_key = @pk;

また

UPDATE dbo.xtable SET fieldx = @uValue WHERE p_key = @pk;

うまくいけば、私は理にかなっていて、それほど遠くない. ご協力いただきありがとうございます。

4

1 に答える 1

3

MSSQL トリガーには、INSERTED (新しいレコード) と DELETED (古いレコード) の 2 つの疑似テーブルがあります。あなたの問題は、UPDATED (存在しない) から 1 つの値を読み取ろうとしていることに加えて、1 つではなく複数のレコードである可能性があることです。UPDATE FROM (MSSQL 固有) を使用する必要があります。つまり、次のようなものです。

UPDATE MyOtherTable
SET ...
FROM INSERTED INNER JOIN TableToFindPk ON  INSERTED.FK = ...
INNER JOIN MyOtherTable ON ...

説明や小さなSQLコードなしでこれ以上言うのは難しい

于 2012-10-30T22:57:00.033 に答える