在存储过程中保留这种逻辑是一个不错的选择。尝试在触发器中实现该逻辑,并且以某种方式最终会看到
ORA-04091: table <your table> is mutating, trigger/function may not see it
例如,在触发器中实现该功能将允许您使用insert
like
insert into <Yourtable> (<col1>...<coln>)
values(val1... valn)
mutating table
但是如果你尝试insert
像这样执行你肯定会得到一个错误
insert into <Yourtable> (<col1>...<coln>)
select col1, .. coln
from some_table
如果您不想使用存储过程,您的另一个选择可能view
是instead of trigger
Create or replace view <ViewName> as
select *
from your_table;
create or replace trigger <Trigger_name>
instead of insert on <View_Name>
begin
-- your logic
end;
此外
此外,要通过约束 (constraint) 强制执行业务规则CHECK
,您可以组合CHECK
约束,materialized view
如下所示: 为您的表创建物化视图(不要忘记在materialized view log
之前创建),该视图将查询违反业务规则约束的数据。
Create materialized view MV_1
refresh complete on commit as
--here goes your query
-- selecting data you want to raise exception on
添加check
始终为假的约束。像这样的东西
alter table MV_1 add constraint CHK check(1=2) deferrable;
完成后,check constraint <..> violated
当您尝试在表中插入违反业务规则约束的数据时,您将得到。