我有这个观点
CREATE VIEW NaveTiconderoga AS
SELECT nume, tip, cate_arme, diametru_tun, deplasament, Nave.clasa, anul_lansarii
FROM Clase, Nave
WHERE Clase.clasa = Nave.Clasa AND Nave.Clasa = 'Ticonderoga';
我希望创建一个允许通过此视图插入的触发器。
我编写了以下代码,但我确信它对于SELECT的WHERE子句来说是不正确的。 有什么指示吗?
CREATE OR REPLACE TRIGGER ticonderoga
instead of insert on NaveTiconderoga
referencing new as new old as old
begin
insert into clase (clasa, tip, cate_arme, diametru_tun, deplasament)
values (:new.clasa, :new.tip, :new.cate_arme, :new.diametru_tun, :new.deplasament);
insert into nave (nume, clasa, anul_lansarii)
values (:new.nume, :new.clasa, :new.anul_lansarii);
end;
答案 0 :(得分:0)
如果要限制插入到视图中的值(以及基础表格),以便您无法放入视图本身无法显示的内容,则无法使用检查约束;但你可以测试触发器内的值,如果你看到不喜欢的东西就抛出异常:
CREATE OR REPLACE TRIGGER ticonderoga
instead of insert on NaveTiconderoga
referencing new as new old as old
begin
if :new.clasa is null or :new.clasa != 'Ticonderoga' then
raise_application_error(-20001, 'Invalid clasa');
end if;
insert into clase (clasa, tip, cate_arme, diametru_tun, deplasament)
...
SQL Fiddle我认为你担心的事情。如果您将其中的触发器更改为:
create trigger tr42
instead of insert on v42
begin
if :new.id != 1 then
raise_application_error(-20001, 'Invalid ID');
end if;
insert into t42 (id) values (:new.id);
end;
/
...然后第二次插入将失败。无论如何,我认为这就是你想要发生的事情。