2013-07-21 28 views
1

我正在研究postgres,我會知道是否有一個簡單的方法來執行裏面觸發調用查詢,而無需再次寫入觸發器內。我自己解釋一下。 我有一個表上的INSERT查詢和執行BEFORE INSERT的觸發器。如果一個條件被驗證,那麼我會執行查詢而不會在觸發器內重寫它(使用NEW變量)。觸發器:執行查詢,如果條件被驗證觸發它

回答

1

如果我正確理解你的問題,請嘗試:

IF (condition) THEN 
    RETURN new; 
ELSE 
    -- statements 
END IF; 

奧斯瓦爾多

+0

您可能想要返回NULL(跳過行)或RAISE EXCEPTION中止ELSE語句中的事務。 –

0

那麼這取決於你有什麼查詢,但你cound使用功能和寫裏面查詢:

create table test (number int); 

CREATE OR REPLACE FUNCTION fn_test_insert("number" integer) 
RETURNS void AS 
$BODY$ 
insert into test (number) -- this is your insert query 
    select $1 
$BODY$ 
LANGUAGE sql; 

CREATE OR REPLACE FUNCTION tr_fn_test_insert() 
RETURNS trigger AS 
$BODY$ 
begin 
perform fn_test_insert(new.number + 1); -- calling your insert query with new + 1 
    return new;       -- as example 
end 
$BODY$ 
LANGUAGE plpgsql; 

CREATE TRIGGER tr_test_insert 
AFTER INSERT 
ON test 
FOR EACH ROW 
WHEN ((new.number < 10)) 
EXECUTE PROCEDURE tr_fn_test_insert(); 

select fn_test_insert(1); 
+0

在觸發器內寫入查詢是我會避免的! – giozh

+0

我正在使用SQL Server和用戶Postgres只是爲了好玩。你爲什麼要避免這種情況? –

+0

在這種情況下,我沒有看到任何錯誤,因爲你只是插入到表中。然而,當人們在觸發器中進行了大量複雜的查詢時,他們遇到了有趣的問題,性能明顯。請記住,觸發器查詢每行運行一次,因此如果您不小心,可能會遇到非常複雜的性能問題。 –