1

私はパスワードを変更するとき、私はPasswordChangeLogテーブル内の任意の結果を見ていないですhttps://www.mssqltips.com/sqlservertip/2708/tracking-login-password-changes-in-sql-server/トリガアクション

からのイベント通知コードを実装しようとしています。 はパスワードを変更するたびにになるはずです。

私には間違いありません。私はもう一度別のサーバーでこの作業を行い、エラーログから多くの情報を得ることができるかどうかを確認します(このサーバーは汚染されています)。

私が実行しているコードは次のとおりです。私は何度か見直しをしました...何かが欠けていますか?私の重要な変更の1つは、エントリが検出されたときにストアドプロシージャを実行するために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サーバー(収集サーバー)が関係します。

あなたが投稿したものがサーバーの監視対象である場合は、いくつか不足しています。コレクション
サーバー、およびGUIDの名前を参照し、ルートを作成し、特定のグループにエンドポイントに またはPUBLIC

  • をENDPOINT
  • グラントCONNECTを作成

    1. :基本的なoutineはになります (アクティベーションプロシージャが存在する)というメッセージを受け取るデータベースの名前です。

    このような何か:

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

    あなたが適切に設定収集サーバを持っていたら、監視対象のサーバー上のイベント通知セッションを作成します。コレクションサーバーで

    、以下を行う必要があります。

    1. 特定のグループまたはPUBLIC
    2. にエンドポイント間
    3. グラントCONNECTを作成
    4. 、監視対象サーバの名前を参照し、ルートを作成そして、 MSDBデータベースのGUID
    5. は、必要に応じてアクティベーションPROCを作成し、あなたが
    6. 集めるイベントを永続化するためにテーブルを作成
    7. これが役に立てば幸い を利用者へのサービスに送信したり、PUBLIC

    グラントキュー

  • に基づいてサービスを作成
  • アクティベーションPROCを参照され、キューの作成 -

  • +0

    OICを..毎日新しいものを見つけよう。これは魅力的です...監視対象のサーバーも監視サーバーですか?ありがとうございました! – RelativitySQL

    +0

    構成が適切に行われたと仮定して、同じサーバー上で発生しない理由はわかりません。しかし、非常に忙しいサーバーの場合、パフォーマンスに影響する可能性があります。 – NedOtter