2017-06-02 29 views
1

好的,只是爲了闡明:我有一個SQL表(包含ID,學校,學生ID,名稱,費用$,費用類型和付費(作爲列)),需要張貼在將在網站上上傳的網格。網格顯示正確的一切,並顯示什麼費用需要支付。 Paid列的數據類型爲1或0(基本上是一個清單)。我被要求添加兩列:User和DateChanged。之所以要記錄哪些員工更改了「付費」欄。它只會捕獲在SQL表中更改它的工作人員的用戶名以及時間。因此,爲了更清楚地說明,我需要創建2列:「User,DateChanged」,當有人更改「Paid」列時,列將記錄日誌。如何在列更改時通過SQL更新列?有點像日誌! Microsoft SQL Server Management Studio

例如:用戶:Bob在5/2/17晚上10點檢查X學生的Paid列。

在X學生信息的同一行中,用戶列Tom將出現在那裏。在DateChanged下,它會顯示2017-05-02 10pm。

我會採取哪些措施使之成爲可能。

我目前是IT實習生,所有這些SQL的東西都是我的新東西。讓我知道你是否需要更多的澄清。僅供參考兩個新的列:用戶,DateChanged不會在網格上。

+1

爲模式更改添加觸發器,如此處所述https://stackoverflow.com/a/726502/6459948 –

+1

因此您需要更改表以添加列,然後添加觸發器以填充這些列,當您的位國旗變化。這裏要考慮的另一件事是行版本控制。你只會關心看到最後一個改變它的人,或者最後3個人?如果是後者,請查看行版本控制。有很多方法 - 每次更改某行時,都會插入一個帶有「effectiveDate」列的新行。如果這種情況經常發生,你的桌子將會急劇增長,所以一定要研究它。 – scsimon

回答

1

正如您所描述的那樣執行此操作的方法是使用觸發器。我有一個下面的代碼示例,但將被警告,因爲觸發器可能會有意想不到的副作用,具體取決於數據庫和應用程序界面的設置方式。

如果有可能爲你改變發送SQL查詢數據庫,而不是應用程序代碼,這將是比使用觸發安全。你仍然可以添加新的字段,你只需要依靠應用程序來保持它們的更新,而不是在SQL中完成。

事情要記住這個代碼:

  • 如果任何後臺進程或程序進行更新的表,它會自動覆蓋時間戳和用戶名,因爲這是觸發任何更新的行(s)有問題。
  • 如果用戶沒有任何直接訪問SQL Server的權限(換句話說,應用程序是唯一連接到數據庫的應用程序),那麼應用程序可能只會爲每個人使用一個數據庫登錄用戶名,在這種情況下,除非您可以更改應用程序代碼,否則您將無法確定哪位用戶進行了更新。
  • 如果有人因意外更改了某些內容,然後又將其更改回來,它會覆蓋您的時間戳並使其看起來像錯誤的人員進行了更新。
  • 如果持續存在大量行和/或對錶進行大量更新,則觸發器可能會使數據庫系統陷入停滯狀態,因爲觸發器代碼將在每次更新時執行在表中排。

但是,如果你沒有訪問更改應用程序代碼,您想給觸發一個嘗試,這裏的一些示例代碼,應該做你需要什麼:

create trigger TG_Payments_Update on Payments 
after update 
as 
begin 

update Payments 
set DateChanged = GetDate(), UserChanged = USER_NAME() 
from Payments, inserted 
where Payments.ID = inserted.ID 

end 
0

該網站應用程序已經知道在系統上工作的當前用戶,因此您的更新只會包含該用戶的標識以及操作發生時的當前系統時間。

我不會依賴SQL Server觸發器,因爲它隱藏了系統內正在發生的事情。另外,正如其他人所說,他們也有副作用。

相關問題