2014-03-29 39 views
0

我試着寫的PostgreSQL 9.1數據庫的觸發器,是這樣的:禁用自動提交PostgreSQL中創建觸發器

CREATE FUNCTION test_trigger() 
RETURNS trigger AS 
BEGIN 
IF() THEN INSERT INTO...; 
ELSEIF()...; 
... 
... 
END IF; 
RETURN NULL; 
END 

然後我得到這個錯誤:

Cannot commit when autoCommit is enabled error 

所以,我試圖禁用它使用set autocommit=off;但後來得到這個消息:

ERROR: SET AUTOCOMMIT TO OFF is no longer supported 

提出的一種解決方案WA s使用BEGIN開始交易,但我不知道如何編輯我的觸發器功能來做到這一點。

UPDATE

我試圖與創建觸發器禁用自動提交如下:

BEGIN; 
CREATE FUNCTION test_trigger() 
RETURNS trigger AS 
$func$ 
BEGIN 
IF() THEN INSERT INTO...; 
ELSEIF()...; 
... 
... 
END IF; 
RETURN NULL; 
END 
COMMIT; 
$func$ 
LANGUAGE plpgsql; 

但連不上我每次運行這個時間。

回答

3

這可能是一個誤解。自動提交似乎不是問題。

函數體是字符串,你需要報價它。通常你會使用dollar-quoting,使您的生活更輕鬆:

CREATE FUNCTION test_trigger() 
RETURNS trigger AS 
$func$ 
BEGIN 
IF() THEN INSERT INTO...; 
ELSEIF()...; 
... 
... 
END IF; 
RETURN NULL; 
END 
$func$ LANGUAGE plpgsql;

除此之外,爲「禁用」自動提交,start a transaction。這就是你最後一條建議的解決方案的目標:

BEGIN;    -- starts transaction 
UPDATE tbl ...;  -- not commited yet 
CREATE FUNCTION ...; -- not commited yet 
COMMIT;    -- *now* we commit 
+0

所以我必須結合這兩部分?請檢查我的更新後的帖子 – Shadin

+0

@Oxi:如前所述,我不認爲,autocommit是一個問題。只需修復create function語句即可。你不能在函數體中啓動/停止事務。一個函數總是原子的。 –

+0

我修正了你提到的問題(在帖子中),但每次運行命令時連接都關閉。 – Shadin