2011-01-03 13 views
3

変更できないテーブル構造を持つMaximoデータベースがあります。私は作成または更新されるたびにPERSONテーブルにプライマリ電子メールアドレスをコピーしようとしています。SQLトリガーで別のテーブルを更新する

PERSONID | EMAIL | ...(other irrelevant columns)... 

EMAILテーブル:

PERSONID | EMAILADDRESS | ISPRIMARY | ...(other irrelevant columns)... 

あなたが見ることができるように、2つのテーブルがリンクされている次のような構造は、PERSONテーブルとEMAILテーブル


PERSONテーブルを説明しますPERSONID列に追加します。ここで私はトリガをしたいものです:
EMAILテーブルが更新されるか、新しい行が挿入されている場合は、PERSONテーブルの対応するエントリ(対応するPERSONID)にEMAILADDRESSフィールドをコピーします。 ISPRIMARYフィールドは1(1はプライマリを意味し、0はセカンダリを意味する)です。
私は多くのトリガを書いていないので、EMAILテーブルに更新または挿入されている行だけを見て、新しい/更新されたプライマリ電子メールアドレスがある場合はPERSONテーブルを更新するだけです。すべてのあなたの助けをありがとう!


UPDATE 1:私はそのトリガがいつでも何かが更新または電子メールに挿入されて動作するはずと信じて

CREATE TRIGGER EMAIL_update ON UPDATE,INSERT AS BEGIN  
UPDATE p 
SET p.email = i.emailaddress 
FROM dbo.PERSON as p 
INNER JOIN inserted AS i ON i.PERSONID = p.PERSONID AND i.isprimary=1 
END 


ケイドの応答を見た後、ここで私は、フォームに始めていたトリガであります表。

答えて

4

問題はEMAILテーブルに主キーがないことに関連しています。トリガーは不変の主キーで最も効果的です。

また、行がプライマリに変更された場合、PERSONからエントリを削除しますか?

問題のドメインでまだ開いている質問のようですが、ここではトリガーがどのように見えるかを突き止めます。あなたは、変更が実際に起こっている行を探すいくつかのものを追加することができますが、NULLについては注意してください。

CREATE TRIGGER EMAIL_update ON UPDATE 
AS 
BEGIN 
    UPDATE PERSON 
    SET EMAIL = i.EMAILADDRESS  
    FROM PERSON 
    INNER JOIN inserted AS i 
     ON i.PERSONID = PERSON.PERSONID 
    INNER JOIN deleted AS d -- could try changing this to a left join and use same trigger for INSERT 
     ON -- what? could use PERSONID, but it's not unique 
    WHERE i.ISPRIMARY = 1 -- This helps with uniqueness, but what about things leaving primary? 
    -- AND i.EMAILADDRESS <> PERSON.EMAIL -- Could add this (what about NULLs?) 
END 
+0

私はあなたがそれに向かっているのが好きです。 Maximoシステムは、PERSONIDごとに固有のISPRIMARY項目を1つだけ保証します。彼らはそれをどうやってセットアップするのかちょっと奇妙だと私は同意しますが、なぜ彼らはそうしたのか理解しています。 –

関連する問題