2013-11-20 93 views
-1

我有這種說法INSTEAD OF觸發器,插上視圖

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; 
+4

什麼「不正確」?你還沒有發佈你的表格定義。您沒有向我們展示您正在使用的'INSERT'語句的示例。你沒有告訴我們觸發器實際上做了什麼。你沒有告訴我們這與你想要的觸發器有什麼不同。 –

+0

你的意思是說它允許你在視圖中插入一條記錄,然後它不會出現在視圖中;因爲你可以插入一個不是「Ticonderoga」的clasa值? –

+0

我想說的是,我將如何解釋這在觸發器內部「WHERE Clase.clasa = Nave.Clasa AND Nave.Clasa ='Ticonderoga';」 –

回答

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; 
/

...然後第二次插入將失敗。無論如何,我認爲這就是你想要發生的事情。

相關問題