摆脱插入触发器

时间:2011-02-10 04:23:37

标签: database oracle plsql triggers

尝试探索使用插入触发器的替代解决方案。像基于API的那些以及不同方法的利弊。

3 个答案:

答案 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