摆脱插入触发器
Posted
技术标签:
【中文标题】摆脱插入触发器【英文标题】:getting rid of Insert trigger 【发布时间】:2011-02-10 04:23:36 【问题描述】:尝试探索替代使用插入触发器的解决方案。喜欢基于 API 的方法以及不同方法的优缺点。
【问题讨论】:
如果您希望我们展示一些代码,请先展示您目前拥有的代码。 也许只需要对触发器进行性能调整。 【参考方案1】:在 API 方法中,您将创建一个过程来执行这两种操作 - 类似于:
package body emp_api is
procedure insert_emp (...) is
begin
insert into emp (...) values (...);
-- Insert that was previously in trigger
insert into other_table (...) values (...);
end;
end;
然后您强制应用程序使用 API,方法是授予它们对 api 包的 EXECUTE 访问权限,但不授予对表的 INSERT/UPDATE/DELETE 访问权限。
【讨论】:
当然,您需要进行测量以确保这种方法实际上更快。【参考方案2】:如果您想保证在将某些内容插入 tableA 时将一条记录插入 tableB,请保留触发器。如果批量加载到 tableA 中,您可以禁用,并且可以保证在此期间您将唯一的进程加载到该表中。
一旦删除触发器,就无法保证插入到 tableB 中。您唯一的希望是任何和所有可能插入到 tableA 的程序(你真的知道所有这些吗?)坚持到 tableB 的辅助插入。这是“通过公司政策实现数据完整性”,而不是通过 Oracle 强制执行的数据完整性。
我想这种方法取决于您对表 B 中数据状态的关心程度。
我不会走 table apis (TAPIs) 的路线,它现在通过一些处理逻辑的 pl/sql api 强制任何/所有操作。根据我的经验,这些几乎总是很慢而且有问题。
【讨论】:
不确定您是否指的是我的回答,但我也不提倡 TAPI。我提倡事务 API,有时也称为 XAPI。我比较反对触发因素,尽管不是为了简单的用途,例如特别是在问题中。 @tony,我仍然会避免强制所有 DML 通过程序的方法【参考方案3】:在 DDL 中,您可以使用 ALTER TRIGGER 或 ALTER TABLE 禁用触发器。
ALTER TRIGGER triggername DISABLE; -- disable a single trigger
ALTER TABLE tablename DISABLE ALL TRIGGERS; -- disable all triggers on a table
要在运行时执行此操作,您必须使用动态 SQL,并且运行过程的架构必须拥有该表或拥有必要的权限。
EXECUTE IMMEDIATE 'ALTER TRIGGER tablename DISABLE ALL TRIGGERS';
有关启用/禁用触发器的更多信息,请参阅http://download.oracle.com/docs/cd/B28359_01/server.111/b28310/general004.htm
【讨论】:
以上是关于摆脱插入触发器的主要内容,如果未能解决你的问题,请参考以下文章