问题

我经常看到上面写着rules should be avoided and triggers used instead.我可以看到规则系统中的危险,但规则当然也有合法的用途,对吗?他们是什么?

我问这个是出于普遍的兴趣,我对数据库不是很熟悉.

可能是有效使用的示例

例如,过go 我需要锁定某些数据,所以我做了这样的事情:

CREATE OR REPLACE RULE protect_data AS
  ON UPDATE TO exampletable             -- another similar rule for DELETE
  WHERE OLD.type = 'protected'
  DO INSTEAD NOTHING;

然后,如果我想编辑受保护的数据:

START TRANSACTION;
  ALTER TABLE exampletable DISABLE RULE protect_data;
  -- edit data as I like
  ALTER TABLE exampletable ENABLE RULE protect_data;
COMMIT;

我同意这是黑客行为,但在这种情况下,我无法更改访问数据库的应用程序(甚至无法抛出错误).所以bonus points是为了找出a dangerous/invalid use of the rule system的原因,而not是为了找出bad design的原因.

推荐答案

规则的一个用例是可更新的视图(尽管随着9.1版本引入视图而不是触发器,这一点在9.1中有所改变)

手册中还有另一个很好的解释:

对于两者都可以实现的内容,哪个最好取决于数据库的使用情况.触发器为任何受影响的行触发一次.规则操作查询或生成附加查询.因此,如果在一条语句中影响多行,则发出一个额外命令的规则可能比为每一行调用且必须多次执行其操作的触发器更快.然而,触发器方法在概念上要比规则方法简单得多,而且新手更容易做对.

(摘自:http://www.postgresql.org/docs/current/static/rules-triggers.html)

Database相关问答推荐

powerapps 中的 ClearCollect 未按预期收集数据

在GridDB中使用存储过程失败

如何在没有sqlmock的情况下模拟db ping

从仅连接器电源查询制作图表

如何将 Grails 3.0 连接到我的本地 Mysql 数据库

使用 Java 对 mysql 数据库进行简单备份和恢复

Django:如何以线程安全的方式执行 get_or_create()?

The method setListAdapter(ArrayAdapter) is undefined for the type create

行之间的 SQL 差异

将 Android Room 数据库与 Firebase 实时数据库相关联

我是否需要为关系数据库表的主键创建单独的索引

如何在 SSIS 中插入新记录之前清空我的目标表?

MongoDB中的数据库数据大小

PostgreSQL 哈希索引

处理多个表的最佳实践

如何将纬度/经度对转换为 PostGIS 地理类型?

Rails:'schema.rb' 中的版本号是否用于任何用途?

Phonegap 离线数据库

为什么 DBMS 不支持 ASSERTION

Data Mapper 是不是比 Active Record 更现代的趋势