2013-08-26 142 views
0

我有一個相當大的postgreql數據庫,我已經繼承。我們有一份每月運行的作業,備份現有的數據庫,並創建一個包含我們收到的更新的供應商數據的新數據庫。Postgresql - 確定從級聯刪除中刪除了哪些記錄

目前存在一個小問題。沒有深入瞭解表設置的細節,數據的建模等等,我相信可以通過一個簡單的刪除查詢來修復它,因爲表設置爲使用級聯刪除。

但是,從供應商提供的源代碼生成這個數據庫大約需要9個小時,所以我一直猶豫要引入新的更改。我目前有一個這個數據庫的副本,我打算首先運行查詢,以使用戶'CAN'成功運行。然而,一般來說,sql的一個缺點是,在執行刪除操作時,輸出通常是單獨的行:

查詢成功返回:x行受影響,y ms執行時間。

在使用級聯刪除時,在postgres中確定從哪些表中刪除哪些行時有沒有辦法?我想在我的副本上運行查詢,看看是否正在放棄什麼是我期望的,至少在哪些表正在被擊中。這可能嗎?

回答

1

有沒有辦法在postgres中確定使用級聯刪除時從哪些表中刪除了哪些行?

不幸的是沒有簡單的內置方式,但它是一個好主意。由於級聯刪除是通過觸發器實現的,所以您只需修改參照完整性觸發器,以便級聯刪除在刪除級別消息之前使用行信息生成一個LOG級別的消息。這將需要修改PostgreSQL源代碼並重新編譯。

或者,您也可以登錄所有刪除通過創建一個新AFTER DELETE ... FOR EACH ROW觸發器在每張桌子上通過級聯約束引用。它可以是簡單:

CREATE OR REPLACE FUNCTION log_delete() RETURNS trigger AS $$ 
BEGIN 
    RAISE LOG 'Deleting row % (statement is %)', OLD, current_query(); 
    RETURN NULL; 
END; 
$$ LANGUAGE plpgsql; 

這樣,你不需要修改數據庫,但你需要在每個表這是受到級聯刪除安裝的觸發。

對於獎勵積分,您甚至可以通過查詢information_schema來獲得外鍵關係,從而自動創建獎勵點,但它可能比它的價值更麻煩。

+0

Craig,謝謝你的信息。雖然不幸的是沒有簡單的方法來做到這一點,但我會考慮嘗試第二個建議。我相信對我來說,處理我的工作會更容易。 –