Postgresql

UPDATE SET x = NULL 的 Postgres 策略

  • February 3, 2021

當列設置為時,Postgres 採取的策略尚不清楚NULL

UPDATE tbl SET
 col1 = NULL,
 col2 = NULL
WHERE created < current_date - INTERVAL '1 year';

文件https://www.postgresql.org/docs/current/mvcc.html有點冗長和技術性,所以我不能可靠地推斷:

如果設置為 NULL 或複制受影響的行/頁

看起來任何 UPDATE 都應該為 MVCC 語義創建新行,但如果設置為 NULL 是一種特殊情況怎麼辦?

對於 GDPR 合規性,我認為將所有個人歷史數據都歸零,並嘗試理解大量週期性的含義UPDATE SET x = NULL。之後我應該考慮VACUUM嗎?

PostgreSQL 從不UPDATE通過修改現有數據來執行。如果您將 columns 設置為NULL,將像任何其他 一樣創建新的行版本UPDATE,並且之前的行版本將保留直到VACUUM回收它們。

但請注意

  • VACUUM如果沒有長時間執行的事務仍可能需要舊數據,則只會刪除舊行版本。
  • VACUUM不會覆蓋數據,因此舊值仍將保留在磁碟上,直到空間被重新使用。

關於 GDPR,措辭是

數據主體有權要求控制者及時刪除與其有關的個人數據,控制者有義務及時刪除個人數據

該法律沒有對“擦除”一詞進行定義,因此需要對其進行解釋。我敢打賭,很少有人能夠充分了解 PostgreSQL 的內部工作原理,從而對DELETE擦除進行質疑。並且需要具有高級 PostgreSQL 知識的數據取證專家來檢索這些數據。一旦VACUUM執行,幾乎不可能做到這一點。如果我作為專家證人被傳喚到法庭,我會說DELETE在數據庫中執行過的任何人都已採取所有可能的步驟來刪除數據。

如果您感到偏執,VACUUM請在有問題的桌子上安排一個正常,並確保您沒有長時間執行的事務。除此之外的任何擔心都是愚蠢的。

引用自:https://dba.stackexchange.com/questions/284604