Postgresql

如果只更新了一列 postgresql,如何檢查更新觸發器

  • July 19, 2018

我有一個包含許多列的表和一個指示是否同步的特殊列。當我處理的其他列中發生更新並更新“日誌”表時,此更新帶有未同步標誌,但是在處理此更新時,我使用標誌同步更新同一行,在這種情況下我不寫入日誌表。例子:

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 列。

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