我正在准备模型驱动开发的考试。我碰到一个特定的数据库触发器:数据库触发器:列值与空变量的比较
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好赶上!编辑。 –