在SQL登入密码更改

在SQL登入密码更改

问题描述:

触发动作我试图从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 

事件通知通常涉及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