我們在應用程式中使用了一些延遲約束觸發器,我希望使用 pgTap 為它們撰寫一些測驗。對于資料庫測驗,我們喜歡將事物包裝在事務中,以便在最后隔離和清理所有內容,但這給延遲約束觸發器帶來了問題,因為除非事務被提交,否則它們似乎不會觸發(按設計)。
有沒有辦法讓他們使用保存點觸發?我嘗試了類似下面的簡單操作,但除非我提交外部事務,否則延遲觸發器似乎不會觸發。
BEGIN TRANSACTION;
CREATE TABLE test_table_with_trigger
(
comment text
);
CREATE FUNCTION t_fn_test() RETURNS TRIGGER AS
$$
BEGIN
RAISE INFO '%', tg_argv;
RETURN NEW;
END;
$$
LANGUAGE plpgsql VOLATILE;
CREATE CONSTRAINT TRIGGER t_test_constraint
AFTER INSERT
ON test_table_with_trigger DEFERRABLE INITIALLY IMMEDIATE
FOR EACH ROW
EXECUTE PROCEDURE t_fn_test('constraint trigger');
CREATE TRIGGER t_test
AFTER INSERT
ON test_table_with_trigger
FOR EACH ROW
EXECUTE PROCEDURE t_fn_test('row trigger');
SAVEPOINT nested;
INSERT INTO test_table_with_trigger (comment) VALUES ('will it trigger?');
RELEASE SAVEPOINT nested;
ROLLBACK;
uj5u.com熱心網友回復:
您可以SET CONSTRAINTS ALL IMMEDIATE在交易結束前發出,這將導致延遲約束的立即執行。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/436669.html
標籤:PostgreSQL
