postgresql无法创建触发器
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了postgresql无法创建触发器相关的知识,希望对你有一定的参考价值。
总报错,从create附近开始就有错,奇怪了为什么呢
PostgreSQL的触发可以指定触发操作前尝试一行(在检查约束之前INSERT,UPDATE或DELETE)或操作完成后(在检查约束之后和INSERT,UPDATE或DELETE(删除)已完成),或替代的操作(在视图上插入,更新或删除的情况下)..FOR EACH ROW触发器被标记的操作修改的每一行被称为一次。相比之下,FOR EACH STATEMENT触发器为只执行一次对于任何给定的操作,不管它有多少行修改。
WHEN子句和触发器动作可能访问的行元素被插入,删除或更新使用的形式NEW.column-name和OLD.column-name,其中列名是从表中的列名的引用该触发器相关联的。 www.yiibai.com
如果提供WHEN子句,PostgreSQL的报表只执行WHEN子句为true的行。如果没有提供WHEN子句,PostgreSQL的语句执行的所有行。
如果有多个相同类型的触发器定义了相同的事件,他们将被触发名称是按字母顺序排列。
BEFORE,AFTER或INSTEAD OF关键字决定何时触发动作将被执行,相对于插入,修改或移除相关的行。www.yiibai.com
触发器表,它们与丢弃时自动删除。 yiibai.com
要修改的表必须存在,在同一数据库中的表或视图,触发器被附加,必须使用表名而不使用database.tablename。
约束时指定的选项创建一个约束触发器。这是一个普通的触发器除外,可以调整使用SET(设定)约束的触发器触发的定时相同。预计约束触发器违反他们所实施的限制时引发异常.. 参考技术A 说错和cui89煤v9i
PostgreSQL表依赖性跟踪
如果你创建了一个包含许多表,并且带有外键约束、视图、触发器、函数等复杂的数据库结构。那么你就会在对象之间隐含地创建了一个依赖性的网络。比如,一个带有外键约束的表依赖于它所引用的表。
为了保证整个数据库结构的完整性,PostgreSQL 保证你无法删除那些还被其它对象依赖的对象。比如,试图删除在里被订单表所依赖的产品表是不能成功的,会有类似下面的错误消息出现:
DROP TABLE products; NOTICE: constraint orders_product_no_fkey on table orders depends on table products ERROR: cannot drop table products because other objects depend on it HINT: Use DROP ... CASCADE to drop the dependent objects too.
这个错误消息包含一个有用的提示:如果你不想麻烦的分别删除所有依赖对象,你可以运行:
DROP TABLE products CASCADE;
然后所有被依赖的对象都将被删除(并不删除订单表,只是删除外键约束)。如果你想检查DROP ... CASCADE会干什么,运行不带CASCADE 的DROP然后阅读NOTICE消息。
PostgreSQL里的所有删除命令都支持声明CASCADE。当然,具体的依赖性实体取决于对象的类型。你也可以写RESTRICT 而不是CASCADE以获取缺省的行为(防止删除那些其它对象所依赖的对象)。
注意: 根据 SQL 标准,要求至少声明RESTRICT或CASCADE中的一个。实际上没有哪种数据库系统强制这一点,但是缺省的行为是RESTRICT 还是CASCADE则因系统而异。
注意: 在PostgreSQL 7.3之前的外键约束依赖性和序列字段依赖性在升级过程中都不会得到维护或者创建。所有其它的依赖性类型在从7.3版本以前的数据库升级过程中都将得到恰当的创建。
以上是关于postgresql无法创建触发器的主要内容,如果未能解决你的问题,请参考以下文章
设置 PostgreSQL,无法连接到数据库 postgres
在 Postgres 中使用审计表为 NOTIFY/LISTEN 创建触发器是个好主意吗?