I. 教程
II. SQL 语言
III. 服务器管理
- 章14. 安装指导
- 章15. 在 Windows 上安装客户端
- 章16. 操作系统环境
- 章17. 服务器配置
- 章18. 数据库角色和权限
- 章19. 管理数据库
- 章21. 区域
- 章20. 用户认证
- 章22. 日常数据库维护工作
- 章23. 备份与恢复
- 章24. 高可用性与负载均衡
- 章25. 监控数据库的活动
- 章26. 监控磁盘使用情况
- 章27. 可靠性和预写式日志
- 章28. 回归测试
IV. 客户端接口
- Chapter 28. libpq - C 库
- 章29.
- Chapter 30. ecpg - 在 C 里嵌入 SQL
- Chapter 31. 信息模式
- 31.2. 数据类型
- 31.3. informationschemacatalog_name
- 31.4. applicable_roles
- 31.5. check_constraints
- 31.6. columndomainusage
- 31.7. column_privileges
- 31.8. columnudtusage
- 31.9. columns
- 31.10. constraintcolumnusage
- 31.11. constrainttableusage
- 31.12. datatypeprivileges
- 31.13. domain_constraints
- 31.14. domainudtusage
- 31.15. domains
- 31.16. element_types
- 31.17. enabled_roles
- 31.18. keycolumnusage
- 31.20. referential_constraints
- 31.21. rolecolumngrants
- 31.22. roleroutinegrants
- 31.23. roletablegrants
- 31.24. roleusagegrants
- 31.25. routine_privileges
- 31.26. routines
- 31.27. schemata
- 31.28. sql_features
- 31.29. sqlimplementationinfo
- 31.30. sql_languages
- 31.31. sql_packages
- 31.32. sql_sizing
- 31.33. sqlsizingprofiles
- 31.34. table_constraints
- 31.35. table_privileges
- 31.36. tables
- 31.37. triggers
- 31.38. usage_privileges
- 31.39. viewcolumnusage
- 31.40. viewtableusage
- 31.41. views
V. 服务器端编程
- 章33. 扩展 SQL
- 章34. 触发器
- 章35. 规则系统
- 章36. 过程语言
- 章37. PL/pgSQL - SQL 过程语言
- 章38. PL/Tcl - Tcl 过程语言
- 章39. PL/Perl - Perl 过程语言
- 章40. PL/Python - Python 过程语言
- 章41. 服务器编程接口
VI. 参考手册
- I. SQL 命令
- ABORT
- ALTER AGGREGATE
- ALTER CONVERSION
- ALTER DATABASE
- ALTER DOMAIN
- ALTER FUNCTION
- ALTER GROUP
- ALTER INDEX
- ALTER LANGUAGE
- ALTER OPERATOR
- ALTER OPERATOR CLASS
- ALTER ROLE
- ALTER SCHEMA
- ALTER SEQUENCE
- ALTER TABLE
- ALTER TABLESPACE
- ALTER TRIGGER
- ALTER TYPE
- ALTER USER
- ANALYZE
- BEGIN
- CHECKPOINT
- CLOSE
- CLUSTER
- COMMENT
- COMMIT PREPARED
- COMMIT
- COPY
- CREATE AGGREGATE
- CREATE CAST
- CREATE CONSTRAINT TRIGGER
- CREATE CONVERSION
- CREATE DATABASE
- CREATE DOMAIN
- CREATE FUNCTION
- CREATE GROUP
- CREATE INDEX
- CREATE LANGUAGE
- CREATE OPERATOR CLASS
- CREATE OPERATOR
- CREATE ROLE
- CREATE RULE
- CREATE SCHEMA
- CREATE SEQUENCE
- CREATE TABLE
- CREATE TABLE AS
- CREATE TABLESPACE
- CREATE TRIGGER
- CREATE TYPE
- CREATE USER
- CREATE VIEW
- DEALLOCATE
- DECLARE
- DELETE
- DROP OWNED
- DROP AGGREGATE
- DROP CAST
- DROP CONVERSION
- DROP DATABASE
- DROP DOMAIN
- DROP FUNCTION
- DROP GROUP
- DROP INDEX
- DROP LANGUAGE
- DROP OPERATOR CLASS
- DROP OPERATOR
- DROP ROLE
- DROP RULE
- DROP SCHEMA
- DROP SEQUENCE
- DROP TABLE
- DROP TABLESPACE
- DROP TRIGGER
- DROP TYPE
- DROP USER
- DROP VIEW
- END
- EXECUTE
- EXPLAIN
- FETCH
- GRANT
- INSERT
- LISTEN
- LOAD
- LOCK
- MOVE
- NOTIFY
- PREPARE TRANSACTION
- PREPARE
- REASSIGN OWNED
- REINDEX
- RELEASE SAVEPOINT
- RESET
- REVOKE
- ROLLBACK PREPARED
- ROLLBACK TO SAVEPOINT
- ROLLBACK
- SAVEPOINT
- SELECT
- SELECT INTO
- SET
- SET CONSTRAINTS
- SET ROLE
- SET SESSION AUTHORIZATION
- SET TRANSACTION
- SHOW
- START TRANSACTION
- TRUNCATE
- UNLISTEN
- UPDATE
- VACUUM
- II. PostgreSQL 客户端应用程序
- III. PostgreSQL 服务器应用程序
VII. 内部
- 章42. PostgreSQL 内部概貌
- 章43. 系统表
- 43.1. 概述
- 43.2. pg_aggregate
- 43.3. pg_am
- 43.4. pg_amop
- 43.5. pg_amproc
- 43.6. pg_attrdef
- 43.7. pg_attribute
- 43.8. pg_authid
- 43.9. pgauthmembers
- 43.10. pg_autovacuum
- 43.11. pg_cast
- 43.12. pg_class
- 43.13. pg_constraint
- 43.14. pg_conversion
- 43.15. pg_database
- 43.16. pg_depend
- 43.17. pg_description
- 43.18. pg_index
- 43.19. pg_inherits
- 43.20. pg_language
- 43.21. pg_largeobject
- 43.22. pg_listener
- 43.23. pg_namespace
- 43.24. pg_opclass
- 43.25. pg_operator
- 43.26. pg_pltemplate
- 43.27. pg_proc
- 43.28. pg_rewrite
- 43.29. pg_shdepend
- 43.30. pg_shdescription
- 43.31. pg_statistic
- 43.32. pg_tablespace
- 43.33. pg_trigger
- 43.34. pg_type
- 43.35. 系统视图
- 43.36. pg_cursors
- 43.37. pg_group
- 43.38. pg_indexes
- 43.39. pg_locks
- 43.40. pgpreparedstatements
- 43.41. pgpreparedxacts
- 43.42. pg_roles
- 43.43. pg_rules
- 43.44. pg_settings
- 43.45. pg_shadow
- 43.46. pg_stats
- 43.47. pg_tables
- 43.48. pgtimezoneabbrevs
- 43.49. pgtimezonenames
- 43.50. pg_user
- 43.51. pg_views
- 章44. 前/后端协议
- 章45. PostgreSQL 编码约定
- 章46. 本地语言支持
- 章47. 书写一个过程语言处理器
- 章48. 基因查询优化器
- 章49. 索引访问方法接口定义
- 章50. GiST 索引
- 章51. GIN 索引
- 章52. 数据库物理存储
- 章53. BKI 后端接口
- 章54. 规划器如何使用统计信息
VIII. 附录
CREATE TRIGGER
名称
CREATE TRIGGER--定义一个新触发器语法
CREATE TRIGGERname
{ BEFORE | AFTER } {event
[ OR ... ] } ONtable
[ FOR [ EACH ] { ROW | STATEMENT } ] EXECUTE PROCEDUREfuncname
(arguments
)
描述
CREATE TRIGGER
创建一个新的触发器。触发器将与指定表关联并且将在特定事件发生时执行声明的 funcname
函数。
触发器可以声明为在对记录进行操作之前(在检查约束之前和 INSERT
, UPDATE
, DELETE
执行前)或操作完成之后(在检查约束之后和完成 INSERT
, UPDATE
, DELETE
操作)触发。如果触发器在事件之前,触发器可能略过当前记录的操作或改变被插入的记录(只对 INSERT
和 UPDATE
操作有效)。如果触发器在事件之后,所有更改,包括最后的插入、更新、删除对触发器都是"可见"的。
一个被标记为 FOR EACH ROW
的触发器为操作修改的每一行都调用一次。比如,一个影响 10 行的 DELETE
将导致任何在目标关系上的 ON DELETE
触发器独立调用 10 次,每个被删除的行调用一次。相比之下,一个被标记为 FOR EACH STATEMENT
的触发器只执行一次,而不管有多少行被修改。特别是,一个修改零行的操作仍然会导致合适的 FOR EACH STATEMENT
触发器被执行。
如果多个同类型的触发器为同一事件做了定义,那么它们将按照字母顺序被触发。
SELECT
并不更改任何行,因此你不能创建 SELECT
触发器。这种场合下规则和视图更合适些。
请参考章34获取更多触发器信息。
参数
name
赋予新触发器的名称。它必需和任何作用于同一表的触发器不同。
BEFORE
AFTER
决定该函数是在事件之前还是之后调用。
event
INSERT
,UPDATE
,DELETE
之一。它声明击发触发器的事件。多个事件可以用OR
声明。table
触发器作用的表名称(可以用模式修饰)
FOR EACH ROW
FOR EACH STATEMENT
这些选项声明触发器过程是否为触发器事件影响的每个行触发一次,还是只为每条 SQL 语句触发一次。如果都没有声明,那么
FOR EACH STATEMENT
将是缺省。funcname
一个用户提供的函数,它声明为不接受参数并且返回
trigger
类型,该函数将在触发器被触发时调用。arguments
一个可选的用逗号分隔的参数列表,它将在触发器执行的时候提供给函数。这些参数是文本字符串常量。也可以在这里写简单的名字和数值常量,但是它们会被转换成字符串。请检查实现语言中关于如何在触发器函数中访问触发器参数的描述;这些参数可能和普通的函数参数不同。
注意
要在表上创建一个触发器,用户必需在该表上有 TRIGGER
权限。
在 PostgreSQL 7.3 以前,必须把触发器函数声明为返回 opaque
占位类型,而不是 trigger
类型。为了支持加载老的转储文件,CREATE TRIGGER
将接受一个声明为返回 opaque
的函数,但是它将发出一条 NOTICE 并且把函数声明的返回类型改成 trigger
。
用 DROP TRIGGER 删除一个触发器。
例子
节34.4包含一个完整的例子。
兼容性
PostgreSQL 里的 CREATE TRIGGER
语句实现了一个 SQL 标准的子集。目前仍然缺少下面的功能:
SQL 允许触发器为指定字段的更新进行触发(也就是
AFTER UPDATE OF col1, col2
)SQL 允许你为"old"和"new"行或者表定义别名,用于定义触发器的动作(也就是
CREATE TRIGGER ... ON tablename REFERENCING OLD ROW AS somename NEW ROW AS othername ...
)。因为 PostgreSQL 允许触发器过程以任意数量的用户定义语言进行书写,所以访问数据的工作是用和语言相关的方法实现的。PostgreSQL 只允许为触发的动作执行用户预先定义好的函数。SQL 标准允许执行一些其它的命令,比如拿
CREATE TABLE
作为触发器动作。这个限止并不难绕开,只要创建一个执行这些命令的用户预定的函数即可。
SQL 要求多个触发器应该以创建的时间顺序执行。PostgreSQL 采用的是按照名字顺序,并认为这样更加方便。
SQL 要求必须在级联 DELETE
完成之后再触发级联删除上的 BEFORE DELETE
触发器。PostgreSQL 的行为是 BEFORE DELETE
将永远在删除动作之前触发,即使对于级联删除也是如此,我们认为这样更一致。当 BEFORE
触发器修改随后将要被有关动作修改的行的时候,仍然存在不可预知的行为。这将导致违反约束或者存储不符合参照完整性的数据。
用 OR
给一个触发器声明多个动作是 PostgreSQL 对标准的扩展。
又见
CREATE FUNCTION, ALTER TRIGGER, DROP TRIGGER如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论