考虑如下定义的视图branch_cust
:
Create view branch_cust as
select
branch_name,
customer_name
from depositor, account
where depositor.account_number = account.account_number
假设一个视图是物化的;即计算并存储视图。编写一个触发器来维护视图,也就是说,在向存款人或帐户插入和从中删除时使其保持最新状态。不要为更新而烦恼。
我尝试使用引用新表作为对存款人执行插入触发器但它也犯了错误。这就是代码。
create or replace trigger insert_dep
after insert on depositor REFERENCING NEW TABLE as inserted
FOR EACH ROW BEGIN
insert into branch_cust select branchname, cusname
from inserted, account
where inserted.account = account.acc; end;
问题不清楚,branch_cust是表或视图还是物化视图??我将尝试回答所有3种情况:
- branch_cust是view:您查看给定的DDL是一个复杂的视图,这意味着它上的DML将失败。此外,由于您使用一个触发器插入branch_cust(它是由表寄存器形成的(,该触发器也在寄存器上,因此即使您使视图变得简单,您也会出现变化错误。因此,这种情况永远不会成功
- branch_cust是物化视图:不能在物化视图中执行插入操作。因此,触发器将失败
- branchcust是表:如果您想保留一个由帐户连接的存款人数据的单独副本,就可以实现这一点。但我建议不要这么做
假设视图是物化
然后插入它是没有意义的,因为这些更改无论如何都会在第一次刷新时丢失。
因此,由于您似乎希望在对其源表进行更改后立即刷新它,请将其设置为提交时刷新。这里有一个例子:
SQL> create materialized view mv_emp
2 refresh complete
3 on commit
4 as
5 select deptno, sum(sal) sumsal
6 From emp
7 group by deptno;
Materialized view created.
SQL> select * from mv_emp order by deptno;
DEPTNO SUMSAL
---------- ----------
10 13750
20 10995
30 9400
SQL> update emp set sal = sal + 1 where deptno = 10;
3 rows updated.
SQL> commit;
Commit complete.
SQL> select * from mv_emp order by deptno;
DEPTNO SUMSAL
---------- ----------
10 13753 --> new value for DEPTNO = 10
20 10995
30 9400
SQL>