2016-11-11 88 views
1

使用SQL Server 2008R2登錄觸發器審計

我在登錄觸發器合作,抓住誰了。我已經創建了一個觸發登錄的用戶,但它捕獲SQL代理帳戶,並且將它像瘋了一樣。我想從列表中排除它,但我不確定如何修改觸發器以實現此目的。不同的嘗試鎖定了我,我不得不使用DAC來放棄觸發器。

原始代碼:

USE B_DBA; 
GO 

CREATE TRIGGER LogonTrigger ON ALL SERVER FOR LOGON 
AS 
BEGIN 
    IF SUSER_SNAME() <> 'sa' 
    INSERT INTO B_DBA.dbo.LogonAudit (UserName, LogonDate, spid) 
      VALUES (SUSER_SNAME(), GETDATE(), @@SPID) 
END; 
GO 
ENABLE TRIGGER LogonTrigger ON ALL SERVER; 

我想補充基本上是一個where子句,但我一直沒能成功地加入它,它不會對中頻部分工作。

Where not in (Select service_account from sys.dm_server_services) 

任何幫助,將不勝感激。

+0

如果您的應用程序驗證它的用戶,但使用一個單獨的SQL Server帳戶來訪問數據庫,那麼應用程序將需要記錄身份驗證。 – HABO

+0

沒有涉及的應用程序。我只是插入每個登錄到數據庫的用戶。這將在多個服務器上,這就是爲什麼我需要動態的地方,而不是靜態帳戶。 – bwilliamson

+0

@ H.Fadlallah請注意,[tag:sql]標籤僅適用於答案應該使用ISO/IEC標準SQL的問題(您可以在標籤的彈出窗口中閱讀該標籤)。這個問題沒有答案可能在標準的SQL。 [tag:tsql]標記用於T-SQL答案。 –

回答

0

未經檢驗的,但好像你應該能夠修改您的IF語句來檢查sys.dm_server_services

USE B_DBA; 
GO 

CREATE TRIGGER LogonTrigger ON ALL SERVER FOR LOGON 
AS 
BEGIN 
    IF SUSER_SNAME() <> 'sa' 
    AND NOT EXISTS (SELECT service_account FROM sys.dm_server_services WHERE service_account = SUSER_SNAME()) 
    INSERT INTO B_DBA.dbo.LogonAudit (UserName, LogonDate, spid) 
      VALUES (SUSER_SNAME(), GETDATE(), @@SPID) 
END; 
GO 
ENABLE TRIGGER LogonTrigger ON ALL SERVER; 
+0

我同意這樣做,但我測試了腳本,它仍然將該系統代理帳戶添加到表中。 – bwilliamson

+0

@bwilliamson - 「sys.dm_server_services」中的帳戶名稱是否與您的審計表中記錄的名稱相匹配? –

+0

他們這樣做。服務帳戶是Prod \ SQLname。表中的條目是Prod \ SQLname。 (改變名字以保護無辜)。 – bwilliamson