2011-02-10 125 views
2

试图探索替代使用插入触发器的解决方案。像基于API的方法和利用不同方法的优点和缺点。摆脱插入触发器

+0

如果你想我们展示一些代码,请通过展示你有什么迄今启动。 – 2011-02-10 08:54:00

+0

也许触发器需要进行性能调整。 – HLGEM 2011-02-16 14:30:32

回答

3

在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; 

然后你应用程序,给他们EXECUTE的API包,但没有INSERT访问使用API/UPDATE/DELETE访问表。

+0

当然,您需要进行测量以确保这种方法实际上更快。 – HLGEM 2011-02-16 14:30:15

0

如果你想保证在插入tableA的时候有一条记录插入tableB,那么保持触发器。如果批量加载到tableA中,并且可以保证在此期间将唯一的进程加载到该表中,则可以禁用该功能。

只要您删除触发器,就没有关于插入到tableB的任何保证。你唯一的希望是,任何和所有可能插入到tableA中的程序(你是否真的知道所有这些?)都坚持把二级插入到tableB中。这是“通过公司策略实现的数据完整性”,而不是通过Oracle执行的数据完整性。

这种方法取决于你有多少关心tableB中数据的状态我想。

我不会去表apis(TAPIs)的路由,它现在强制任何/所有操作通过处理逻辑的一些pl/sql api。根据我的经验,这些几乎总是很慢且很麻烦。

0

在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