如何为一组表编写通用触发器?

How to write a generalized trigger for a set of tables?

我的目标是在更新或删除这些 table 中的条目时创建少数 table 的触发器。 触发器应该将相应updated/deleted table的名称和列输入到另一个用户table。 除了为每个 table 编写单独的触发器之外,是否可以编写单个触发器?

Instead of writing individual triggers for each table is it possible to write a single trigger?

[TL;DR] 否


CREATE TRIGGER syntax是:

Syntax

create_trigger ::=

plsql_trigger_source ::=

simple_dml_trigger ::=

dml_event_clause ::=

从语法图中可以看出,简单 DML 的 CREATE TRIGGER 格式为:

CREATE TRIGGER trigger_name
  AFTER UPDATE OR DELETE ON table_name

语法要求为每个触发器指定一个 table/view 标识符。

正如@MT0 指出的那样,触发器与 table 相关联,因此您需要为每个 table.

创建单独的触发器

另一方面,如果您真的想这样做,您可以编写代码,为许多不同的 table 动态生成您想要的触发器。这通常在最初需要做更多的工作,但如果您真的想创建一堆具有相同基本逻辑的不同触发器,那么最初的前期投资可能是合理的。

例如,您可以编写一些动态 SQL 来根据数据字典创建您想要的触发器。有关示例,请参见 this fiddle。我没有花任何时间在细节上,比如让生成的触发器代码特别容易让人阅读,或者充实你实际想要写入日志的内容的要求 table。例如,大多数人会想检查列的 :new 值是否与列的 :old 值不同,以查看它是否实际更改,而不是使用 updating 函数.我还猜测您的实际要求涉及将更新或删除的实际值写入日志 table,这会根据您支持的数据类型和日志结构等因素变得复杂 table .

就我个人而言,我总是对这种要求持怀疑态度。 Oracle 有许多 built-in 功能使重复触发器不太理想。例如,我宁愿为您想要跟踪的任何 table 启用 flashback data archive,也不愿处理一堆触发器的开销。