pg_get_ruledef() 是一个系统函数,它会重现用于创建规则的命令。
pg_get_ruledef() 在 PostgreSQL 6.4 中引入。
用法
pg_get_ruledef (ruleoid[,prettyboolean] ) →text
默认情况下,规则创建命令会以一种适合包含在 pg_dump 输出中的详细格式返回。然而,如果设置了 pretty 参数(默认值:false)为 true,则该命令会以一种更紧凑、更易读的格式生成。
请注意,生成的命令是对反编译的重构,而不是原始定义命令的文本。
从 PostgreSQL 16 开始,pg_get_ruledef() 会为视图和物化视图发出 ON SELECT 的定义,但发出的 SQL 无法执行,因为手动创建 ON SELECT 规则已不再可能。
在内部,pg_get_ruledef() 被系统视图 pg_rules 使用,以生成比底层 pg_rewrite 系统表更用户友好的规则表示。
变更历史
- PostgreSQL 7.4
- 添加了
pretty选项 (commit 52347b66)
- 添加了
- PostgreSQL 6.4
- 添加(提交 15cb32d9)
示例
给定一个如下生成的规则
postgres=# CREATE RULE foobar AS ON INSERT TO foo WHERE NEW.id % 2 = 1 DO INSTEAD NOTHING; CREATE RULE
pg_get_ruledef() 会重现命令,形式为
postgres=# SELECT pg_get_ruledef(oid)
FROM pg_rewrite
WHERE rulename='foobar';
pg_get_ruledef
-------------------------------------------------
CREATE RULE foobar AS +
ON INSERT TO public.foo +
WHERE ((new.id % 2) = 1) DO INSTEAD NOTHING;
(1 row)
或
postgres=# SELECT pg_get_ruledef(oid, true)
FROM pg_rewrite
WHERE rulename='foobar';
pg_get_ruledef
-----------------------------------------------
CREATE RULE foobar AS +
ON INSERT TO foo +
WHERE (new.id % 2) = 1 DO INSTEAD NOTHING;
(1 row)
参考资料
- PostgreSQL 文档: 系统目录信息函数
