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
OIC .. 。每天學些新東西。這很吸引人......監控服務器也可以作爲監控服務器嗎?謝謝! – RelativitySQL
我不明白爲什麼它不能在同一臺服務器上發生的,假設的配置進行了適當。但對於非常繁忙的服務器,它可能會影響性能。 – NedOtter