我正在爲外部接收記錄csv,然後當我創建或更新postgresql條目時,需要創建一個鏡像只有符號差異的條目。這可以在程序級完成,我很想知道是否可以使用觸發器。 對於我可以找到的示例,它們都以代碼結尾, FOR EACH ROW EXECUTE PROCEDURE foo()
並且通常會處理檢查,使用NEW.additionalfield
添加附加信息,或插入另一個表中。如果我以這種方式使用觸發器在同一個表中插入另一行,看起來觸發器將再次觸發,並且創建變爲遞歸。 任何方法來解決這個問題?如何在postgresql中創建/更新一行時觸發創建/更新另一行記錄
回答
當觸發器處理,拇指規則是:
如果它改變了當前行,基於一些業務規則或其他(例如添加額外的信息或處理計算字段),它屬於
BEFORE
觸發器。如果它在單獨的表中有一個或多個行有副作用,它屬於
AFTER
觸發器。如果它運行在完整性檢查任何表,沒有其他的內置約束(檢查,獨特的鍵,外鍵,排除等),可以照顧的,它屬於一個
CONSTRAINT
[後]觸發。如果對同一表中的一個或多個其他行副作用,你應該重新審視你的模式,你的代碼流,或兩者兼而有之。
關於最後一點,其實有解決方法的Postgres的,如想獲得一個鎖或檢查XMIN VS事務的XID,以避免在遞歸情況下陷入困境。最近的版本另外引入了pg_trigger_depth()
。但我仍然建議反對它。
請注意,約束觸發器可創建爲deferrable initially deferred
。這將延遲限制觸發器,直到交易的最後,而不是緊接在該陳述之後。
您的問題和暱稱暗示您想知道如何在複式簿記應用程序中自動平衡一組行。假設如此,請不要自動創建平衡條目。相反,開始一個事務,單獨輸入每一行,並且有一個(對於每一行,可延遲的最初延遲)約束觸發器從那裏挑選事物,如果有任何不平衡,則拒絕整個批處理。如果你想平衡兩三條以上的路線,那麼這樣做會讓你頭痛不已。
另一個解讀可能是您想要創建審計線索。如果是這樣,則創建其他審計表並在觸發器之後使用它們來填充它們。有多種方式來創建和管理這些審計表。看看slowly changing dimensions。 (Fwiw,類型6,start_end
列tsrange
或tstzrange
列可以很好地用於審計表,如果您對錶的完整歷史記錄感興趣,包括其與其他審計表的關係歷史記錄。)爲您的應用程序使用「實時」表以保持速度,並在需要歷史報告時使用審計表。
- 1. 如何在更新後創建觸發器以更改記錄?
- 2. 創建觸發器更新後更新另一個表
- 3. T-SQL如何在更新行後創建更新觸發器以更新列?
- 4. 創建更新觸發器
- 5. 創建更新觸發器
- 6. 創建MySQL觸發器來更新另一個表中的多個記錄
- 7. 創建或更新記錄
- 8. 如何創建更新觸發器
- 9. 創建觸發器以更新插入或更新記錄上的時間戳?
- 10. 在同一表中更新並創建新記錄
- 11. PostgreSQL觸發和行更新
- 12. 創建觸發器,更新時,另一個表中的列被更新在一個表中的列
- 13. Oracle - 創建更新另一個表的觸發器的問題
- 14. 創建觸發器只在創建新表時運行
- 15. 在創建表mySQL時進行更新
- 16. 觸發另一個表更新行
- 17. 每次在django中創建另一行時創建一行
- 18. Rails遷移在另一個表中創建條目時更新現有記錄
- 19. 使用觸發器更新新創建的行值
- 20. 如何在Postgres中創建一個存儲函數更新行?
- 21. 如何在另一個表完成後更新列來創建觸發器?
- 22. 在postgres中創建一個更新FIFO的觸發器
- 23. 如何創建只更新記錄(如果新記錄與舊記錄不同)的觸發器?
- 24. 如何在更新其他表時創建觸發器
- 25. 創建新記錄的頂點觸發器創建號碼
- 26. PDO UPDATE創建新記錄而不是更新一個
- 27. 創建狀態更新觸發
- 28. 插入更新後創建觸發器
- 29. 創建單觸發插入/更新
- 30. 試圖創建一個觸發器,只允許更新記錄不到三天