PostgreSQL校验id_user与id_manager不等的触发器未生效如何解决
问题原因
你编写的触发器函数存在逻辑错误:函数内的SELECT id_user FROM users和SELECT id_manager FROM users是针对整张users表执行全表查询,仅会返回表中第一行的对应字段值,完全没有校验当前待插入/更新行的id_user和id_manager,所以匹配不到你预期的校验规则,异常自然不会触发。
修复方案
直接修改触发器函数,使用行级触发器专属的NEW变量,获取当前待插入/更新行的两个字段做对比即可:
create or replace function "Test"() returns trigger language plpgsql as $func$ BEGIN -- 直接校验当前行的两个字段值 IF NEW.id_user = NEW.id_manager THEN RAISE EXCEPTION 'User ID and Manager ID cannot be the same values!'; END IF; RETURN NEW; END $func$; alter function "Test"() owner to xxxxxx;
如果你的业务规则允许两个字段同时为NULL,不需要额外调整:PostgreSQL中NULL = NULL的判断结果为NULL,不会进入IF分支触发异常。如果需要禁止两个字段同时为NULL,可以修改判断条件为:
IF NEW.id_user = NEW.id_manager OR (NEW.id_user IS NULL AND NEW.id_manager IS NULL) THEN
原有触发器的触发时机、触发条件配置均正确,不需要修改。
内容的提问来源于stack exchange,提问作者Lubos Jansky
相关产品推荐
相关产品推荐

