Sql-Server
用於使用者審核的系統視圖觸發器的替代方法
即使是寫標題,我也對我嘗試過的這個想法感到畏縮(但是,嘿,我在這個過程中學到了一些東西)。
我遇到了開發人員在數據庫上執行遷移腳本並在覆蓋數據庫中已經存在的儲存過程的過程中的問題(DEV,感謝上帝)。
但是,無法找出是誰進行了這些更改,因為:
- 他們不承認
- SQL Server 不會填充系統視圖
principal_id
中的列sys.objects
,因為每個人都在連接dbo
(更多資訊在這裡)。所以,我嘗試在 sys.objects 上編寫一個觸發器,但沒有成功(我不知道為什麼我會期望它),因為我遇到了一個錯誤:
對象“DEV_DB.sys.objects”不存在或對此操作無效。
我還嘗試為每個開發人員創建一個使用者,這樣當他們進行自動遷移時,他們將使用我創建的使用者,並希望
sys.objects
該開發人員所做的所有更改都將以他們登錄的使用者身份登錄。但這也不起作用,因為
principal_id
仍然沒有填充(我所做的是為每個開發人員和數據庫創建一個新的登錄名/使用者,並為登錄名提供特定的伺服器角色:public
、、、、db_datawriter
)db_datareader``db_ddladmin
。關於我還可以嘗試什麼作為替代方案的任何建議?
您始終可以點擊預設跟踪以擷取對對象的任何更改,包括儲存的過程。
試一試下面的腳本,很容易找出誰更改了什麼以及何時更改。它幫助我抓住了不止一個狡猾的開發人員;)
SELECT t.DatabaseName, t.ObjectID,t.NTUserName,t.HostName,t.StartTime, te.name FROM ::fn_trace_gettable('C:\Program Files\Microsoft SQL Server\MSSQL13.SQL2016\MSSQL\Log\log.trc', DEFAULT) t JOIN sys.trace_events te on t.EventClass = te.trace_event_id ORDER BY t.StartTime DESC;
您需要更改 SQL 跟踪文件所在位置的路徑,以了解它的執行位置:
select path from sys.traces where id = 1
一個提示,
_number
從文件名中刪除 以讀取所有可用的跟踪文件,例如,如果文件名是log_16.trc
,則將其更改為log.trc
.