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 RULE
名称
CREATE RULE--定义一个新重写规则语法
CREATE [ OR REPLACE ] RULEname
AS ONevent
TOtable
[ WHEREcondition
] DO [ ALSO | INSTEAD ] { NOTHING |command
| (command
;command
... ) }
描述
CREATE RULE
定义一个适用于特定表或者视图的新规则。CREATE OR REPLACE RULE
要么是创建一个新规则,要么是替换一个表上的同名规则。
PostgreSQL 规则系统允许在更新、插入、删除时执行一个其它的预定义动作。简单的说,规则就是在指定表上执行指定动作的时候,将导致一些额外的动作被执行。另外,一个 INSTEAD
规则可以用另外一个命令取代特定的命令,或者令完全不执行该命令。规则还可以用于实现表视图。规则实际上只是一个命令转换机制,或者说命令宏。这种转换发生在命令开始执行之前。如果你想要针对每个物理行独立发生的操作,那么可能应该使用触发器而不是规则。有关规则的更多信息可以在章35找到。
目前,ON SELECT
规则必须是无条件的 INSTEAD
规则并且必须有一个由单独一条 SELECT
查询组成的动作。因此,一条 ON SELECT
规则有效地把表转成视图,它的可见内容是规则的 SELECT
查询返回的记录而不是存储在表中的内容。写一条 CREATE VIEW
命令比创建一个表然后在上面定义一条 ON SELECT
规则的风格要好。
你可以创建一个允许更新的视图的幻觉,方法是在视图上定义 ON INSERT
, ON UPDATE
, ON DELETE
规则(或者满足你需要的任何上述规则的子集),用合适的对其它表的更新替换在视图上更新的动作。如果打算支持 INSERT RETURNING
之类,就必须确保在规则的结尾放置恰当的 RETURNING
子句。
如果你想在视图更新上使用条件规则,那么这里就有一个补充:对你希望在视图上允许的每个动作,你都必须有一个无条件的 INSTEAD
规则。如果规则是有条件的或者它不是 INSTEAD
,那么系统仍将拒绝执行更新动作,因为它认为最终会在视图的虚拟表上执行这个动作。如果你想处理条件规则上的所有有用的情况,那只需要增加一个无条件的 DO INSTEAD NOTHING
规则确保系统明白它决不会被调用来更新虚拟表就可以了。然后把条件规则做成非 INSTEAD
;在这种情况下,如果它们被触发,那么它们就增加到缺省的 INSTEAD NOTHING
动作中。不过这种方法目前不支持 RETURNING
查询。
参数
name
创建的规则名。它必须在同一个表上的所有规则名字中唯一。同一个表上的同一个事件类型的规则是按照字母顺序运行的。
event
SELECT
,INSERT
,UPDATE
,DELETE
事件之一table
规则作用的表或者视图的名字(可以有模式修饰)
condition
任意返回
boolean
的 SQL 条件表达式。条件表达式除了引用NEW
和OLD
之外不能引用任何表,并且不能有聚集函数。INSTEAD
指示使用该命令代替最初的命令。
ALSO
该命令应该在最初的命令执行之后一起执行。
如果既没有声明
ALSO
也没有声明INSTEAD
,那么ALSO
是缺省。command
组成规则动作的命令。有效的命令是
SELECT
,INSERT
,UPDATE
,DELETE
,NOTIFY
语句之一。
在 condition
和 command
里,特殊的表名字 NEW
和 OLD
可以用于指向被引用表里的数值。NEW
在 ON INSERT
和 ON UPDATE
规则里可以指向被插入或更新的新行。OLD
在 ON UPDATE
和 ON DELETE
规则里可以指向现存的被更新或删除的行。
注意
为了在表上定义或修改规则,你必须是该表的拥有者。
在视图上用于 INSERT
, UPDATE
, DELETE
的规则中可以添加 RETURNING
子句基于视图的字段返回。如果规则被 INSERT RETURNING
, UPDATE RETURNING
, DELETE RETURNING
命令触发,这些子句将用来计算输出结果。如果规则被不带 RETURNING
的命令触发,那么规则的 RETURNING
子句将被忽略。目前仅允许无条件的 INSTEAD
规则包含 RETURNING
子句,而且在同一个事件内的所有规则中最多只能有一个 RETURNING
子句。这样就确保只有一个 RETURNING
子句可以用于计算结果。如果在任何有效规则中都不存在 RETURNING
子句,该视图上的 RETURNING
查询将被拒绝。
有一件很重要的事情是要避免循环规则。比如,尽管下面两条规则定义都是 PostgreSQL 可以接受的,但其中的一条 SELECT
命令会导致 PostgreSQL 报告一条错误信息,因为该查询循环了太多次:
CREATE RULE "_RETURN" AS ON SELECT TO t1 DO INSTEAD SELECT * FROM t2; CREATE RULE "_RETURN" AS ON SELECT TO t2 DO INSTEAD SELECT * FROM t1; SELECT * FROM t1;
目前,如果一个规则包含一个 NOTIFY
命令,那么该 NOTIFY
命令将被无条件执行,也就是说,即使规则不施加到任何行上面,该 NOTIFY
也会被执行。比如,在
CREATE RULE notify_me AS ON UPDATE TO mytable DO ALSO NOTIFY mytable; UPDATE mytable SET name = 'foo' WHERE id = 42;
里,一个 NOTIFY
事件将在 UPDATE
的时候发出,不管是否有满足 id = 42
条件的行。这是一个实现的限制,将来的版本应该修补这个毛病。
兼容性
CREATE RULE
是 PostgreSQL 语言的扩展,整个规则重写系统都是如此。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论