Ich bereite mich auf eine Prüfung auf Model-Driven Development vor. Ich stieß auf eine bestimmte Datenbank-Trigger:Datenbankauslöser: Vergleich von Spaltenwert mit leerer Variable
CREATE TRIGGER tManager_bi
FOR Manager BEFORE INSERT AS
DECLARE VARIABLE v_company_name CHAR(30);
BEGIN
SELECT M.company
FROM Manager M
WHERE M.nr = NEW.reports_to
INTO :v_company_name;
IF (NOT(NEW.company = v_company_name))
THEN EXCEPTION eReportsNotOwnCompany;
END
Dieser Trigger ausgelegt Eingang ein Manager Berichte an einen externen Manager, in dem zu verhindern, das heißt eine, die nicht von der gleichen Firma ist. Die entsprechende OCL-Einschränkung ist:
context Manager
inv: self.company = self.reports_to.company
Die entsprechende Tabelle wie (vereinfacht) aussieht:
CREATE TABLE Manager
(
nr INTEGER NOT NULL,
company VARCHAR(50) NOT NULL,
reports_to INTEGER,
PRIMARY KEY (nr),
FOREIGN KEY (reports_to) REFERENCES Manager (nr)
);
Das Lehrbuch sagt, dass dieser Trigger auch korrekt funktionieren, wenn die neu eingefügten Manager nicht zu niemandem berichten (dh NEW.reports_to
ist NULL
), und tatsächlich funktioniert es nach dem Testen richtig.
Aber ich verstehe das nicht. Wenn NEW.reports_to
NULL
ist, würde das bedeuten, dass die Variable v_company_name
leer ist (nicht initialisiert? NULL
?), Was dann bedeuten würde, dass der Vergleich false
zurückgeben würde, wodurch die Ausnahme ausgelöst würde, richtig?
Was fehlt mir hier?
(Die SQL SQL gezeigt werden soll:.. 2003 konform Das MDD-Werkzeug Cathedron ist, die als RDBMS Firebird verwendet)
_ "Dieser Trigger ausgebildet ist Eingabe zu verhindern, in dem ein Manager berichtet sich selbst. "Bist du sicher? Dieser Trigger scheint geschrieben zu sein, um Eingaben zu verhindern, in denen ein Manager einem anderen Unternehmen berichtet. – pilcrow
@pilcrow Guter Fang! Bearbeitet. –