2013-03-22 16 views
0

在我的PostgreSQL 9.1數據庫中,我有多個表和一個觸發器函數。對許多不同的表應用單個觸發器過程

現在我正在使用該觸發器函數爲每個表創建觸發器。

這種方法工作正常。我的老闆要求我通過重新使用該觸發器功能來共同創建觸發器(只有一次)。這一個觸發器函數應該被我的數據庫中的所有表使用。

回答

1

您可以創建一個具有Audit Trigger樣品PostgreSQL的使用PL/pgSQL的動態SQL觸發器的例子。同樣的方法也適用於任何其他的DDL。

請參閱功能audit.audit_table並在此處使用formatEXECUTE

也就是說,需要程序化地創建表格可能(但並非總是)是有問題的模式設計的標誌。

動態SQL創建表的

簡單的例子:

CREATE OR REPLACE FUNCTION demo_dynamic_table(tablename text) RETURNS void AS $$                      
BEGIN                                           
    EXECUTE format('CREATE TABLE %I (id serial primary key);', tablename); 
END; 
$$ LANGUAGE plpgsql; 

同樣的方法適用於創建觸發器等

+0

感謝您在這方面的寶貴時間,'SELECT audit.audit_table('target_table_name','true','false','{version_col,changed_by,changed_timestamp}':: text []);'在這個procudure他們是傳遞單表名作爲第一個參數,我可以通過該參數中的所有表嗎? – 2013-03-22 10:59:47

+0

@GLOIERTECH。 「所有的桌子」?你的意思是*所有的表*即表名列表? – 2013-03-22 12:05:39

+0

@GLOIERTECH。如果你想傳入所有表的列表,你可以傳遞一個數組或者使用一個'VARIADIC'函數,但是最好調用一個集合上的函數,例如'SELECT create_my_trigger(tablename)FROM(VALUES(' table1'),('table2'),('table3'))tablenames(tablename);' – 2013-03-22 12:14:30

0

您可以創建表創建PL/pgSQL的程序和移動你的觸發​​器創建代碼裏面

+1

顯然,您的建議將在我的數據庫,爲每個表上的觸發器我老闆找因爲是爲所有20個表格創建1個觸發器。換句話說,它可能是一個共享觸發器。有沒有可能這樣做。? – 2013-03-22 10:18:54

相關問題