2013-01-09 28 views
0

我想改進PostgreSQL中的觸發器在特定用戶進行修改時被禁用的方式。優化觸發器,排除PostgreSQL中的特定用戶

例如:觸發器應該忽略「應用」用戶所做的更改,並從任何其他用戶的任何修改開始。

我目前使用下面的代碼:

IF (CURRENT_USER = 'app') THEN 
    RETURN NULL; 
END IF; 

如:

CREATE OR REPLACE FUNCTION update_flag() RETURNS trigger AS $BODY$ 
BEGIN 
    IF (CURRENT_USER = 'app') THEN 
     RETURN NULL; 
    END IF; 

    IF (TG_OP = 'INSERT') THEN 
     ... 
    ELSIF (TG_OP = 'UPDATE') THEN 
     ... 
    ELSIF (TG_OP = 'DELETE') THEN 
     ... 
    END IF; 

    RETURN NULL; 

END;$BODY$ 
LANGUAGE plpgsql; 


CREATE TRIGGER trigger_categories AFTER INSERT OR UPDATE OR DELETE 
    ON "categories" 
    FOR EACH ROW 
    EXECUTE PROCEDURE update_flag(); 

你看到改進的餘地嗎?我想在update_flag()的調用之前在CREATE TRIGGER部分嵌入條件,但我無法找到如何。它會有所作爲嗎?

+0

您的PostgreSQL版本? –

+1

當你在current_user ='app''時,你是否嘗試過每一行? (自9.0起可用) –

+0

@IgorRomanchenko我正在使用PostgreSQL 8.4.8 –

回答

3

正如a_horse_with_no_name所指出的那樣,在較新版本中,根據使用WHEN子句至CREATE TRIGGER的表達式,根據CREATE TRIGGER documentation,觸發條件可以作爲條件。

這在8.4中不可用,所以您已經使用了最佳可用選項,在觸發器內測試current_user並返回。

(請注意,current_userSECURITY DEFINER影響。你可能更願意使用session_user代替。)

在一般情況下,運行,只是立即退出觸發對性能的影響是相當小的,尤其是相對於成本索引和表格插入/更新。我不會太擔心;有可能更低的掛果表現。

+0

「有可能是更低的掛錶演水果」:我喜歡這個!這個問題僅僅是爲了完美主義和文件:) –