0

MSSQL トリガーに問題があります。IDが他のテーブルに存在するかどうかをチェックするトリガーを作成したいのですが、存在する場合はレコードを挿入しません。

例 Person があります。Person は Student または Teacher になることができますが、同時に Student と Teacher になることはできません。したがって、挿入しようとしている Student と同じ ID を持つ Teacher が存在するかどうかを挿入および更新する前に確認する必要があります。これは明らかですか?

私は答えを見つけようとしましたが、いくつかのトリガーを見つけましたが、私が望むものではありませんでした。これで私を助けてもらえますか?

問題に UML ダイアグラムを添付します: UML ダイアグラム

モハメド・アリの助けを借りて、私はこれを書きました:

CREATE Trigger tr_TriggerName
ON Student
INSTEAD OF INSERT
AS
BEGIN
  SET NOCOUNT ON;
       IF NOT EXISTS 
            (SELECT Teacher.id 
            FROM Teacher 
            WHERE Teacher.id = 
            (SELECT inserted.id FROM inserted))         
        BEGIN
            /* This isnert is wrong I don't know how to write it?????*/
            INSERT INTO Student VALUES (inserted.id, inserted.field1, inserted.field2); 
        END
        ELSE
            RAISERROR ('There is already a Teacher with the same Student id', 0, 0);
            RETURN
END

これはまさに私が望んでいるものですが、この挿入物の書き方がわかりません。

先ほど、Person は Student または Teacher になることができると書きましたが、同時に Student と Teacher になることはできません。したがって、Student をテーブルに挿入したい場合は、Teachers のテーブルを確認する必要があります。Teacher が同じ Person ID を持つ場合 (挿入しようとする Student など)、エラー メッセージを表示する必要があります。If (または else..:)) Teacher が存在しない場合、彼を挿入する必要がありますが、この挿入をトリガーに書き込む方法がわかりません。

4

2 に答える 2

1

別の方法としてこれを試してください:

CREATE Trigger tr_TriggerName
ON Student
INSTEAD OF INSERT
AS
BEGIN

declare @count int
select @count=count(*) from inserted

insert into Student (id,field1,field2)
select id,field1,field2 from inserted
where id not in (select id from teacher)

if @@ROWCOUNT<@count
  raiserror('Some Teachers were rejected due to conflicts with Student ids', 0, 0);

END

編集:エラーメッセージが複数行挿入の部分的な失敗をカバーするように、少し変更しました。拒否された各idのエラーを表示するには、カーソルを使用する必要があります。

于 2013-10-29T19:31:59.673 に答える