0

PKとしてAutoIdentity列を持ち、「IdentificationCode」と呼ばれるnvarchar列を持つテーブルがあります。新しい行を挿入するときに必要なのは、テーブルで既存のIdentificationCodeを検索し、見つかった場合はトランザクションをロールバックすることだけです。

私は次のトリガーを書きました:

ALTER trigger [dbo].[Disallow_Duplicate_Ids] 
on [dbo].[tbl1]
for insert
as
if ((select COUNT(*) from dbo.tbl1 e , inserted i where e.IdentificationNo = i.IdentificationNo ) > 0)
begin
RAISERROR('Multiple Ids detected',16,1)
ROLLBACK TRANSACTION
end

ただし、新しい行を挿入すると、そのようなIdentificationCodeがない場合でも、常にロールバックがトリガーされます。

誰か助けてくれませんか?

ありがとう

4

2 に答える 2

3

@Qpirateが言及しているように、おそらく列に何らかのUNIQUE制約を課す必要があります。これらを無効にする方法があるため、これはおそらくトリガーを使用するよりも「強力」です。
また、暗黙的結合構文(コンマ区切りFROM句)はSQLアンチパターンと見なされます。可能であれば、常に明示的に結合を宣言してください。

エラーはトリガーがトリガーのように見えるためだと思われます。テーブルに(ゼロ以外の)行があるAFTERどうかを確認します。言い換えれば、トリガーは(おそらく)「失敗」しているのはそれが編集されたからです。(または)トリガーに変更するか、カウントを変更すると、問題が解決する場合があります。INSERT INSERTBEFOREINSTEAD OF>= 2

挿入ステートメントを見ないと、確実に知ることはできませんが(特に、SPを使用している場合)、INSERTステートメント自体に存在するかどうかを確認し、次の場合にエラーをスローする(または何か他のことをする)ことができる場合があります。行は挿入されません。
たとえば、次のようになります。

INSERT INTO tbl1 (identificationCode, *otherColumns*)
VALUES (@identificationCode, *otherColumns)
WHERE NOT EXISTS (SELECT '1'
                  FROM tbl1
                  WHERE identificationCode = @identificationCode)

すでに存在SQLCODE = 100する場合は、「行が見つかりません」(挿入されているなど。ほとんどすべてのシステムでこれが存在する)を示すコードを返します。identificationCode

于 2012-07-05T15:51:56.087 に答える
0

EXISTSを使用して、IdentificationCodeがすでに存在するかどうかを確認します。

If EXISTS (Select * from tbl1 where IdentificationCode = @IdentificationCode )
BEGIN
//do something
END
Else
BEGIN
//do something
END
于 2012-07-05T15:35:20.293 に答える