尝试探索使用插入触发器的替代解决方案。像基于API的那些以及不同方法的利弊。
答案 0 :(得分: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;
然后您强制应用程序使用API,方法是为api包提供EXECUTE访问权限,但不允许对表进行INSERT / UPDATE / DELETE访问。
答案 1 :(得分:0)
如果您想保证在某些内容插入tableA时将某条记录插入tableB,请保留触发器。如果批量加载到tableA中,您可以禁用,并且可以保证在此期间您将唯一的进程加载到该表中。
一旦删除触发器,就无法保证插入到tableB中。你唯一的希望是可以插入tableA的任何和所有程序(你真的知道所有这些吗?)都坚持将二次插入到tableB中。这是“通过公司政策的数据完整性”,而不是通过Oracle实施的数据完整性。
这种方法取决于你对表B中数据状态的关注程度,我认为。
我不会走表api(TAPIs)的路径,它现在通过一些处理逻辑的pl / sql api强制执行任何/所有操作。根据我的经验,这几乎总是缓慢而且有错误。
答案 2 :(得分: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