PostgreSQL创建触发器时无法直接添加schema前缀原因咨询
PostgreSQL触发器指定Schema前缀异常问题说明
底层逻辑原因
PostgreSQL 中触发器是依附于表的附属对象,不属于Schema级别的独立对象,语法设计上不支持为触发器名称直接添加Schema前缀。
不同写法的运行逻辑如下:
- 报错写法:
CREATE OR REPLACE TRIGGER {accountId}.{triggerName}
此时PostgreSQL会尝试将{accountId}解析为触发器的所属Schema,不符合触发器的对象归属规则,因此语法校验不通过执行失败。 - 加双引号后运行成功的本质
双引号在PostgreSQL中会将包裹的内容整体识别为对象名称,不会将其中的.解析为Schema和对象名的分隔符。所以"{accountId}.{triggerName}"实际是创建了一个名称中自带.字符的触发器,并非你以为的“为触发器指定了Schema前缀”,属于理解误区。 - 不写Schema前缀也能归属到正确Schema的原因
你创建的触发器绑定的是{accountId}.{tableCommandsName}表,该表归属{accountId}Schema,触发器作为表的附属对象,会自动跟随表归属到对应Schema下,和你是否将触发器创建语句与CREATE SCHEMA放在同一次执行没有关联。
最佳实践
创建触发器时无需指定Schema前缀,仅填写触发器名称即可。后续需要操作触发器时,通过所属表定位即可,示例语法:
DROP TRIGGER {triggerName} ON {accountId}.{tableCommandsName};
内容的提问来源于stack exchange,提问作者Thomas
相关产品推荐
相关产品推荐

