2016-12-08 7 views
0

私はテーブルの学生と注文を持っています。私がStudentテーブルのStudent IDを変更すると、Order内の参照する行がそれに応じて更新されます。私はトリガを使用しています。それは動作していません。SQL Serverのトリガー更新

create TRIGGER Update_Student 
ON dbo.Student 
AFTER UPDATE 
AS 
BEGIN 
    Declare @oldID int, @newID int 
    Select @oldID = d.StudentID, @newID = i.StudentID 
    from deleted d, inserted i 
    Update Orders 
    set [email protected] where [email protected] 
END 
+0

どのようなエラーが表示されますか? – Swetha

+0

学生表のIDを変更していますが、注文表でIDを変更していません。 – jasmine

答えて

1

これにはいくつかの反パターンがあります。また、挿入されたテーブルと削除されたテーブルを結合する他のフィールドがない限り、コードは現在修正できません。

最初に、暗黙の結合を使用しないでください。これは恐ろしいコーディング手法です。そしてあなたがそこでしたことは、あなたが望むものではない確かにあなたにクロス・ジョイントを与えました。暗黙的な結合が非常に貧弱な技術である主な理由の1つです。

次に、挿入または削除されたレコードが1つしかないという誤った仮定がありました。これは真実ではなく、レコードの変更を1つだけ処理するトリガーを決して設計してはいけません。ある更新ステートメントで1000人の学生を更新した場合、1000個のレコードがすべて挿入され削除されます。あなたがコードを書いた方法は、それらのうちの1つだけがトリガーによって処理されます。トリガー内のスカラー変数を挿入または削除された値に設定するときはいつでも、ある時点でデータの問題が発生します。

次に、ほとんど常に悪い考えである学生テーブルのプライマリキーが変更されている可能性があるという問題があります。主キーは決して変更しないでください。あなたは変化していないナチュラルキーを持っていますか?そうでない場合、どのレコードがどのレコードに関連しているかをどのように知るでしょうか。

あなたは名前を使って参加することができますが、通常はユニークな値ではありません。学生IDが自動生成されない場合は、自動生成されたIDフィールドを追加すると、挿入されたテーブルと削除されたテーブルを一致させるのに役立ちます。あなたの現在の学生IDが自動生成されている場合、それを更新することは、そのようなことを行うよりもよく知っている広範なデータベース経験を持つ人にだけ残すべきものです。

+0

私は主キーを変更すべきではないと私は知っています。私はそのようなコードを行うように求められているので、正しい、論理的な方法を探しています。 – jasmine

+0

このようなことを行う典型的なパターンは、親テーブルに新しいレコードを作成し、次に子レコードを更新することです親から古いレコードを削除します。これはトリガーではほとんど行われませんが、通常は一度だけの変更であるため、ストアドプロシージャやスクリプト(通常はスクリプト)を使用します。 – HLGEM