1

觸發動作我試圖從https://www.mssqltips.com/sqlservertip/2708/tracking-login-password-changes-in-sql-server/在SQL登入密碼更改

實現事件通知代碼我沒有看到在PasswordChangeLog表中的任何結果,當我修改密碼。有應該在這個表我每次更改密碼時的條目。

有沒有錯誤,我可以看到。我將在此再次明天去工作在不同的服務器上,看看我能得到從錯誤日誌信息(此服務器被污染)

這裏是我運行的代碼,它主要是從阿龍的崗位削減&粘貼。我已經多次檢查過...我錯過了什麼?我的一個重要變化是,我在PasswordChangeLog上添加了一個觸發器,以便在檢測到條目時運行存儲過程。

--TriggerEventOnPasswordChange 
USE msdb 

GO 
IF OBJECT_ID('dbo.PasswordChangeLog', 'U') IS NOT NULL 
    DROP TABLE dbo.PasswordChangeLog; 

CREATE TABLE dbo.PasswordChangeLog 
(
    LoginName SYSNAME, 
    EventTime DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP 
); 
GO 
CREATE TRIGGER RunSyncer 
ON dbo.PasswordChangeLog 
AFTER INSERT AS 
    BEGIN 
    SET NOCOUNT ON 
    EXEC sp_Syncer 
    END 

    GO 

ALTER TABLE dbo.PasswordChangeLog ENABLE TRIGGER RunSyncer 

GO 

CREATE QUEUE PasswordChangeQueue; 
GO 


CREATE SERVICE PasswordChangeService ON QUEUE PasswordChangeQueue 
    ([http://schemas.microsoft.com/SQL/Notifications/PostEventNotification]); 
GO 


CREATE EVENT NOTIFICATION PasswordChangeNotification 
    ON SERVER WITH FAN_IN 
    FOR AUDIT_LOGIN_CHANGE_PASSWORD_EVENT 
    TO SERVICE 'PasswordChangeService', 'current database'; 
GO 

CREATE PROCEDURE dbo.LogPasswordChange 
WITH EXECUTE AS OWNER 
AS 
BEGIN 
    SET NOCOUNT ON; 


    DECLARE @message_body XML; 


    WHILE (1 = 1) 
    BEGIN 
     WAITFOR 
     ( 
     RECEIVE TOP(1) @message_body = message_body 
     FROM dbo.PasswordChangeQueue 
     ), TIMEOUT 1000; 


     IF (@@ROWCOUNT = 1) 
     BEGIN 
     INSERT dbo.PasswordChangeLog(LoginName) 
      SELECT @message_body.value('(/EVENT_INSTANCE/LoginName)[1]', 'sysname'); 
     END 
    END 
END 
GO 
ALTER QUEUE PasswordChangeQueue 
WITH ACTIVATION 
(
    STATUS = ON, 
    PROCEDURE_NAME = dbo.LogPasswordChange, 
    MAX_QUEUE_READERS = 1, 
    EXECUTE AS OWNER 
); 
GO 

回答

1

事件通知通常涉及MonitorED服務器和MonitorING服務器(收集服務器)。

如果你發佈的是要監視的服務器,你就錯過了一些東西。基本outine將是:

  1. 創建端點
  2. 格蘭特連接到端點到特定組 或PUBLIC
  3. 創建一個路由,引用集合
    服務器的名稱和GUID的將接收的消息 (您激活PROC所在的)數據庫。

事情是這樣的:

CREATE ROUTE [My_CollectionRoute] 
WITH 
SERVICE_NAME = 'My_Service' 
,BROKER_INSTANCE = <SOME GUID> 
,ADDRESS = 'TCP://COLLECTION-SERVER:4022' 

一旦你收集服務器配置正確,你會被監控服務器上創建的事件通知會話。

在收集服務器,您需要:

  1. 創建端點
  2. 格蘭特連接到端點到特定的組或PUBLIC
  3. 創建一個路由,它引用了監控服務器的名稱,和 MSDB數據庫的GUID
  4. 選擇創建表堅持你收集
  5. 事件創建激活PROC
  6. 創建隊列,它引用激活PROC
  7. 創建基於隊列
  8. 服務授予對服務發送給用戶或PUBLIC

希望這有助於 -

+0

OIC .. 。每天學些新東西。這很吸引人......監控服務器也可以作爲監控服務器嗎?謝謝! – RelativitySQL

+0

我不明白爲什麼它不能在同一臺服務器上發生的,假設的配置進行了適當。但對於非常繁忙的服務器,它可能會影響性能。 – NedOtter