Postgresql
如果只更新了一列 postgresql,如何檢查更新觸發器
我有一個包含許多列的表和一個指示是否同步的特殊列。當我處理的其他列中發生更新並更新“日誌”表時,此更新帶有未同步標誌,但是在處理此更新時,我使用標誌同步更新同一行,在這種情況下我不寫入日誌表。例子:
Table: user( name, last_name, age, ..., sync_status ) IF (TG_OP = 'UPDATE' ) then if new.sync_status != syncstatus_pending then if old.sync_status = syncstatus_pending and new.sync_status != old.sync_status then raise notice 'Sync status updated, It means we are changing from sync pending to sync yes'; return new ; else raise Exception 'The synchronization status is not configured correctly.' ; end if ; end if; -- Check if we are trying to update a not synchronized row if old.sync_status != syncstatus_yes then raise Exception 'It was not possible to update rows are not synchronized.'; end if ; if new.name = old.name and new.last_name = old.last_name and new.age = old.age and old.sync_status= syncstatus_yes and new.sync_status= syncstatus_pending then -- all columns are the same except the sync one, it means that we require sync this row but not to add to log_table return new; else -- process to insert in the other 'log' table -- ... insert into log_table ( ) end if ; end if ;
有沒有其他方法可以檢查是否只有一列正在更新?(表示是否同步)
您可以使用 Syncstatus 列來儲存表示您正在更新的列的二進制程式碼,而不是使用值“syncstatus_yes”。然後將同步狀態原樣移動到日誌中。這樣您就可以準確地知道您正在同步哪些列…
無論您使用您的應用程式碼還是觸發器 OLD 和 NEW 值,您都可以準確地知道哪些列正在被更新。然後您可以使用這些列來建構您的 Syncstatus 列
For example: (suppose you have 6 columns + syncstatus column) Syncstatus = 19 = 010011 = power(2,(6-2))+power(2,(6-5))+power(2,(6-6))
這意味著正在更新第 2、5 和 6 列。