Save every logon to table by trigger

Save every logon to table by trigger. Every logon will be saved in a table with all the needed information.

Last updated:

Warning: Review and test in a non-production environment before running.

Back to results

Create Table master.dbo.audit_logins
(
Col_loginName varchar (50),
Col_LoginType varchar (50),
Col_LoginTime datetime,
Col_ClientHost varchar (50) 
)

Create TRIGGER TR_audit_logins
ON ALL SERVER WITH EXECUTE AS 'sa'
FOR LOGON
AS
BEGIN
       declare @LogonTriggerData xml          
       set @LogonTriggerData = eventdata() ;
       Insert into master..audit_logins 
       Select @LogonTriggerData.value('(/EVENT_INSTANCE/LoginName)[1]', 'varchar(50)'),
              @LogonTriggerData.value('(/EVENT_INSTANCE/LoginType)[1]', 'varchar(50)'),
              @LogonTriggerData.value('(/EVENT_INSTANCE/PostTime)[1]', 'datetime'),         
              @LogonTriggerData.value('(/EVENT_INSTANCE/ClientHost)[1]', 'varchar(50)')          
end

CREATE TABLE ServerLogonHistory
 (SystemUser VARCHAR(100),
  HostName varchar(100),
  DatabaseName varchar(50),
  LogonTime DATETIME)
 GO

 /* Create Logon Trigger */
 CREATE TRIGGER Tr_ServerLogon
 ON ALL SERVER FOR LOGON
 AS
 BEGIN
 INSERT INTO ServerLogonHistory
 SELECT SYSTEM_USER,HOST_NAME(),APP_NAME(), GETDATE()
 END
 GO
 
 SELECT ORIGINAL_LOGIN(), GETDATE(),ORIGINAL_DB_NAME()
        EVENTDATA().value('(/EVENT_INSTANCE/ClientHost)[1]','NVARCHAR(128)')

select HOST_NAME(),APP_NAME(),SUSER_SNAME(),USER_NAME(),SCHEMA_NAME()

select ORIGINAL_LOGIN(), GETDATE(),
 CAST(eventdata().query('/EVENT_INSTANCE/ClientHost[1]') as NVarchar(128)),
 CAST(eventdata().query('/EVENT_INSTANCE/DatabaseName[1]/text()') as NVarchar(128))

CREATE TABLE Db_names(
SvrName VARCHAR(50),
NAME VARCHAR(50),
UserName VARCHAR(50)
);
GO

CREATE TRIGGER some_logon_trigger
ON ALL SERVER
AFTER LOGON
AS
BEGIN

DECLARE @x XML,
        @ServerName NVARCHAR(100),
        @DB_Name NVARCHAR(50),
        @LoginName NVARCHAR(50),
        @Sid VARCHAR(100)
        
SET @x = EVENTDATA()
SET @ServerName = @x.value('(/EVENT_INSTANCE/ServerName) [1]','nvarchar(100)')
SET @LoginName = @x.value('(/EVENT_INSTANCE/LoginName)[1]', 'varchar(50)')
SET @DB_Name = (SELECT default_database_name FROM sys.server_principals WHERE name = @LoginName)

INSERT INTO [Db_names]([SvrName],[NAME],[UserName]) 
VALUES (@ServerName,@LoginName,@DB_Name)
    
END;
GO
--login to the server
SELECT * FROM db_names