我正在準備模型驅動開發的考試。我碰到一個特定的數據庫觸發器:數據庫觸發器:列值與空變量的比較
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
這觸發旨在防止輸入其中一個經理報告,外部經理,即一個不是來自同一家公司。相應的OCL約束是:
context Manager
inv: self.company = self.reports_to.company
相關的表看起來像(簡體):
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)
);
教科書上說,這觸發也將正常工作時,新插入的經理不向任何人報告(即NEW.reports_to
是NULL
),事實上,經過測試,它確實可以正常工作。
但我不明白這一點。如果NEW.reports_to
是NULL
,那將意味着變量v_company_name
將爲空(未初始化?NULL
?),這就意味着比較NEW.company = v_company_name
將返回false
,導致異常被拋出,對吧?
我在這裏錯過了什麼?
(顯示的SQL應該是SQL:2003兼容的MDD工具是Cathedron,它使用火鳥作爲RDBMS)
_「這個觸發器是爲了防止輸入其中經理向自己報告。「_你確定嗎?這種觸發似乎是爲了防止經理向另一家公司的某個人報告輸入而編寫的。 – pilcrow
@pilcrow好趕上!編輯。 –