小白教程
所有教程
关于
Search
172.70.127.95
172.70.127.95
参数设置
贡献
退出
操作
编辑
移动
保护
信息
历史
删除
查看“PostgreSQL 触发器”的源代码
本页内容
上一节:
PostgreSQL_别名
下一节:
PostgreSQL_索引
因为以下原因,您没有权限编辑本页:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
{{DISPLAYTITLE:PostgreSQL 触发器}}[[Category:PostgreSQL 教程|33]] = PostgreSQL 触发器 = PostgreSQL 触发器是数据库的回调函数,它会在指定的数据库事件发生时自动执行/调用。 下面是关于 PostgreSQL 触发器几个比较重要的点: * PostgreSQL 触发器可以在下面几种情况下触发: ** 在执行操作之前(在检查约束并尝试插入、更新或删除之前)。 ** 在执行操作之后(在检查约束并插入、更新或删除完成之后)。 ** 更新操作(在对一个视图进行插入、更新、删除时)。 * 触发器的 FOR EACH ROW 属性是可选的,如果选中,当操作修改时每行调用一次;相反,选中 FOR EACH STATEMENT,不管修改了多少行,每个语句标记的触发器执行一次。 * WHEN 子句和触发器操作在引用 NEW.column-name 和 OLD.column-name 表单插入、删除或更新时可以访问每一行元素。其中 column-name 是与触发器关联的表中的列的名称。 * 如果存在 WHEN 子句,PostgreSQL 语句只会执行 WHEN 子句成立的那一行,如果没有 WHEN 子句,PostgreSQL 语句会在每一行执行。 * BEFORE 或 AFTER 关键字决定何时执行触发器动作,决定是在关联行的插入、修改或删除之前或者之后执行触发器动作。 * 要修改的表必须存在于同一数据库中,作为触发器被附加的表或视图,且必须只使用 tablename,而不是 database.tablename。 * 当创建约束触发器时会指定约束选项。这与常规触发器相同,只是可以使用这种约束来调整触发器触发的时间。当约束触发器实现的约束被违反时,它将抛出异常。 === 语法 === 创建触发器时的基础语法如下: <sample title="" desc="" lang="sql" hererun="1"> CREATE TRIGGER trigger_name [BEFORE|AFTER|INSTEAD OF] event_name ON table_name [ -- 触发器逻辑.... ]; </sample> 在这里,event_name 可以是在所提到的表 table_name 上的 INSERT、DELETE 和 UPDATE 数据库操作。您可以在表名后选择指定 FOR EACH ROW。 以下是在 UPDATE 操作上在表的一个或多个指定列上创建触发器的语法: <sample title="" desc="" lang="sql" hererun="1"> CREATE TRIGGER trigger_name [BEFORE|AFTER] UPDATE OF column_name ON table_name [ -- 触发器逻辑.... ]; </sample> == 让我们假设一个情况,我们要为被插入到新创建的 COMPANY 表(如果已经存在,则删除重新创建)中的每一个记录保持审计试验: <sample title="" desc="" lang="sql" hererun="1"> xiaobaidb=# CREATE TABLE COMPANY( ID INT PRIMARY KEY NOT NULL, NAME TEXT NOT NULL, AGE INT NOT NULL, ADDRESS CHAR(50), SALARY REAL ); </sample> 为了保持审计试验,我们将创建一个名为 AUDIT 的新表。每当 COMPANY 表中有一个新的记录项时,日志消息将被插入其中: <sample title="" desc="" lang="sql" hererun="1"> xiaobaidb=# CREATE TABLE AUDIT( EMP_ID INT NOT NULL, ENTRY_DATE TEXT NOT NULL ); </sample> 在这里,ID 是 AUDIT 记录的 ID,EMP_ID 是来自 COMPANY 表的 ID,DATE 将保持 COMPANY 中记录被创建时的时间戳。所以,现在让我们在 COMPANY 表上创建一个触发器,如下所示: <sample title="" desc="" lang="sql" hererun="1"> xiaobaidb=# CREATE TRIGGER example_trigger AFTER INSERT ON COMPANY FOR EACH ROW EXECUTE PROCEDURE auditlogfunc(); </sample> auditlogfunc() 是 PostgreSQL 一个程序,其定义如下: <sample title="" desc="" lang="sql" hererun="1"> CREATE OR REPLACE FUNCTION auditlogfunc() RETURNS TRIGGER AS $example_table$ BEGIN INSERT INTO AUDIT(EMP_ID, ENTRY_DATE) VALUES (new.ID, current_timestamp); RETURN NEW; END; $example_table$ LANGUAGE plpgsql; </sample> 现在,我们开始往 COMPANY 表中插入数据: <sample title="" desc="" lang="sql" hererun="1"> xiaobaidb=# INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) VALUES (1, 'Paul', 32, 'California', 20000.00 ); </sample> 这时,COMPANY 表中插入了一条记录: 同时, AUDIT 表中也插入了一条记录,因为我们在插入 COMPANY 表时创建了一个触发器。相似的,我们也可以根据需求在更新和删除时创建触发器: <sample title="" desc="" lang="sql" hererun="1"> emp_id | entry_date --------+------------------------------- 1 | 2013-05-05 15:49:59.968+05:30 (1 row) </sample> === 列出触发器 === 你可以把从 pg_trigger 表中把当前数据库所有触发器列举出来: <sample title="" desc="" lang="sql" hererun="1"> xiaobaidb=# SELECT * FROM pg_trigger; </sample> 如果,你想列举出特定表的触发器,语法如下: <sample title="" desc="" lang="sql" hererun="1"> xiaobaidb=# SELECT tgname FROM pg_trigger, pg_class WHERE tgrelid=pg_class.oid AND relname='company'; </sample> 得到结果如下: <sample title="" desc="" lang="sql" hererun="1"> tgname ----------------- example_trigger (1 row) </sample> === 删除触发器 === 删除触发器基础语法如下: <sample title="" desc="" lang="sql" hererun="1"> drop trigger ${trigger_name} on ${table_of_trigger_dependent}; </sample> 删除本文上表 company 上的触发器 example_trigger 的指令为: <sample title="" desc="" lang="sql" hererun="1"> drop trigger example_trigger on company; </sample>
返回至“
PostgreSQL 触发器
”。
上一节:
PostgreSQL_别名
下一节:
PostgreSQL_索引