0

特定のユーザーが変更を加えたときに 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();

ここに改善の余地はありますか?CREATE TRIGGERへの呼び出しの前に、条件を部分に埋め込むことを考えましたがupdate_flag()、方法がわかりません。違いはありますか?

4

1 に答える 1

3

a_horse_with_no_name が指摘しているように、新しいバージョンでは、ドキュメントに従ってWHENto 句を使用して、式を条件としてトリガーを作成できます。CREATE TRIGGERCREATE TRIGGER

これは 8.4 では利用できないためcurrent_user、トリガー内でテストして戻るという、利用可能な最適なオプションを既に使用しています。

current_user(は の影響を受けることに注意してくださいSECURITY DEFINER。代わりに使用することをお勧めしますsession_user。)

一般に、ただちに終了するトリガーを実行することによるパフォーマンスへの影響は、特にインデックスおよびテーブルの挿入/更新のコストと比較すると、かなり小さいものです。あまり心配しません。おそらくハンギングパフォーマンスの低い果物があります。

于 2013-01-09T12:29:16.143 に答える