2011-01-03 18 views
3

Ich habe eine Maximo-Datenbank, die eine Tabellenstruktur hat, die ich nicht ändern kann. Ich versuche, die primäre E-Mail-Adresse in die PERSON-Tabelle zu kopieren, wann immer sie erstellt oder aktualisiert wird. Die folgende Struktur beschreibt die Tabelle Person und E-MAIL-TabelleSQL-Trigger zum Aktualisieren einer anderen Tabelle


PERSON Tabelle:

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

E-MAIL-Tabelle:

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

Wie Sie sehen können, sind die beiden Tabellen verknüpft sind, in der Spalte PERSONID. Hier ist, was ich möchte, dass der Trigger zu tun:
Wenn die EMAIL-Tabelle aktualisiert wird oder eine neue Zeile eingefügt wird, möchte ich das Feld EMAILADDRESS in den entsprechenden Eintrag (wie durch PERSONID verknüpft) in der Tabelle PERSON IF kopieren ISPRIMARY-Feld ist gleich 1 (1 bedeutet primär, 0 bedeutet sekundär).
Ich habe nicht viele Trigger geschrieben, also möchte ich sicherstellen, dass ich nur die Zeilen suche, die aktualisiert oder in die EMAIL-Tabelle eingefügt werden und nur die PERSON-Tabelle aktualisieren, wenn eine neue/aktualisierte primäre E-Mail-Adresse vorhanden ist. Vielen Dank im Voraus für Ihre Hilfe!


UPDATE 1:
Nachdem bei Cade Antwort suchen, hier ist der Auslöser ich Form am Anfang:

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 

ich, dass Trigger glauben sollte jederzeit arbeiten, um etwas aktualisiert oder an die E-Mail eingefügt Tabelle.

Antwort

4

Das Problem wird mit dem Fehlen eines Primärschlüssels in der EMAIL-Tabelle zusammenhängen. Trigger funktionieren am besten mit unveränderlichen Primärschlüsseln.

Was ist, wenn eine Zeile nicht primär wird, entfernen Sie den Eintrag von PERSON?

So scheint immer noch wie offene Fragen in der Problemdomäne, aber hier ist ein Stich, wie der Auslöser aussehen würde. Sie könnten einige Dinge hinzufügen, die nach Zeilen suchen, in denen eine Änderung tatsächlich stattfindet - aber seien Sie vorsichtig bei 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

Ich mag, wohin Sie damit gehen. Das Maximo-System garantiert nur einen einzigen ISPRIMARY-Eintrag pro PERSONID. Ich stimme zu, es ist ein wenig merkwürdig, wie sie es aufgebaut haben, aber ich verstehe, warum sie es so gemacht haben. –

Verwandte Themen