SQL Server 2005 SysAdmin 登录审计的详细介绍


  本文标签:SQL Server 2005 SysAdmin

  以下的文章主要向大家描述的是SQL Server 2005 SysAdmin 登录审计,如果是以sysadmin角色的成员在SQL Server数据库中出现时,我都有审计这一过程的想法  。审计所有成功的登录可以提供信息,然而,它记录每一次连接  。

  Sysadmin登录在一片喧闹声中正失去它自己的地位  。我该怎样做才能只通过SQL Server 2005 sysadmin登

  

  无论何时以sysadmin角色的成员登录到我的SQL Server中,我都想审计这一过程  。审计所有成功的登录可以提供信息,然而,它记录每一次连接  。Sysadmin登录在一片喧闹声中正失去它自己的地位  。我该怎样做才能只通过sysadmin登录到我的SQL Server实例呢?

  

  专家解答

  在SQL Server 2005 Service Pack 2中,微软把登录触发器引入到核心功能中  。与DDL和DML触发器一样,这些触发器在特定的事件上被激活,在这个例子中,无论何时登录到SQL Server实例中,它都会被激活  。当某个特定角色的成员登录时,比如syadmin固定服务器角色,我们可以使用一个登录触发器来审计  。

  为了审计SQL Server 2005 sysadmin固定服务器角色的成员,我们需要使用两个系统视图:sys.server_role_members 和 sys.server_principals  。当登录事件发生时,我们将连接这两个视图来确定这个登录是不是sysadmin角色的成员  。我们可通过如下连接两个视图来得到这些成员:

  1. SELECT sp.principal_id   
  2. FROM sys.server_role_members srm   
  3. INNER JOIN sys.server_principals sp   
  4. ON srm.member_principal_id = sp.principal_id   
  5. WHERE srm.role_principal_id = (   
  6. SELECT principal_id   
  7. FROM sys.server_principals   
  8. WHERE [Name] = sysadmin)   

  这个查询将是我们登录触发器的基础  。通过在我们代码的最后一部分增加一个AND从句,我们可以测试引入的登录是否是SQL Server 2005 sysadmin固定服务器角色的成员  。

  当事件发生时,我们也需要一些空间来记录这些事件  。其中最简单的方法是在一个工作数据库中使用一张表来达到这个目的  。考虑到这些例子的目的性,我将假设这张表能够以DBAWork名义存储在一个DBA数据库中  。以下是相应的代码:

  1. CREATE TABLE dbo.AuditSysAdminLogin   
  2. (AuditEventId INT IDENTITY(1,1) NOT NULL,   
  3. EventTime DATETIME NOT NULL,   
  4. ServerLogin NVARCHAR(100) NOT NULL,   
  5. CONSTRAINT PK_AuditSysAdminLogin PRIMARY KEY CLUSTERED (AuditEventID));   
  6. GO   

  一旦我们有了审计表,我们就可以创建自己的登录触发器  。登录触发器的基本句法和DDL触发器的句法相类似,如下显示:

  1. CREATE TRIGGER   
  2. ON ALL SERVER   
  3. FOR LOGON   
  4. AS   

  按照这种格式和使用以上确定的查询来确定哪一个是SQL Server 2005 SysAdmin角色的成员,那么我们缺少的唯一方面是确认登录的一种方式  。这里有一个系统功能ORIGINAL_LOGIN(),它提供了相关的信息,现在把它放在一起,那么下面就是我们的登录触发器:

  1. USE master;   
  2. GO   
  3. CREATE TRIGGER trigLogon_CheckForSysAdmin   
  4. ON ALL SERVER   
  5. FOR LOGON   
  6. AS   
  7. BEGIN   
  8. IF EXISTS (   
  9. SELECT sp.principal_id   
  10. FROM sys.server_role_members srm   
  11. JOIN sys.server_principals sp   
  12. ON srm.member_principal_id = sp.principal_id   
  13. WHERE role_principal_id = (   
  14. SELECT principal_id   
  15. FROM sys.server_principals   
  16. WHERE NAME = sysadmin)   
  17. AND ORIGINAL_LOGIN() = sp.NAME)   
  18. BEGIN   
  19. INSERT INTO DBAWork.dbo.AuditSysAdminLogin   
  20. (EventTime, ServerLogin)   
  21. VALUES   
  22. (GETDATE(), ORIGINAL_LOGIN())   
  23. END;   
  24. END;   
  25. GO   

  以上的相关内容就是对SQL Server 2005 SysAdmin登录审计的介绍,望你能有所收获  。