SQL Server 2005 SysAdmin登录审计
专家解答
在SQL Server 2005 Service Pack 2中,微软把登录触发器引入到核心功能中。与DDL和DML触发器一样,这些触发器在特定的事件上被激活,在这个例子中,无论何时登录到SQL Server实例中,它都会被激活。当某个特定角色的成员登录时,比如syadmin固定服务器角色,我们可以使用一个登录触发器来审计。
为了审计sysadmin固定服务器角色的成员,我们需要使用两个系统视图:sys.server_role_members 和 sys.server_principals。当登录事件发生时,我们将连接这两个视图来确定这个登录是不是sysadmin角色的成员。我们可通过如下连接两个视图来得到这些成员:
SELECT sp.principal_id
FROM sys.server_role_members srm
INNER JOIN sys.server_principals sp
ON srm.member_principal_id = sp.principal_id
WHERE srm.role_principal_id = (
SELECT principal_id
FROM sys.server_principals
WHERE [Name] = 'sysadmin')
这个查询将是我们登录触发器的基础。通过在我们代码的最后一部分增加一个AND从句,我们可以测试引入的登录是否是sysadmin固定服务器角色的成员。
当事件发生时,我们也需要一些空间来记录这些事件。其中最简单的方法是在一个工作数据库中使用一张表来达到这个目的。考虑到这些例子的目的性,我将假设这张表能够以DBAWork名义存储在一个DBA数据库中。以下是相应的代码:
CREATE TABLE dbo.AuditSysAdminLogin
(AuditEventId INT IDENTITY(1,1) NOT NULL,
EventTime DATETIME NOT NULL,
ServerLogin NVARCHAR(100) NOT NULL,
CONSTRAINT PK_AuditSysAdminLogin PRIMARY KEY CLUSTERED (AuditEventID));
GO
一旦我们有了审计表,我们就可以创建自己的登录触发器。登录触发器的基本句法和DDL触发器的句法相类似,如下显示: CREATE TRIGGER
ON ALL SERVER
FOR LOGON
AS
按照这种格式和使用以上确定的查询来确定哪一个是SysAdmin角色的成员,那么我们缺少的唯一方面是确认登录的一种方式。这里有一个系统功能ORIGINAL_LOGIN(),它提供了相关的信息,现在把它放在一起,那么下面就是我们的登录触发器:
USE master;
GO
CREATE TRIGGER trigLogon_CheckForSysAdmin
ON ALL SERVER
FOR LOGON
AS
BEGIN
IF EXISTS (
SELECT sp.principal_id
FROM sys.server_role_members srm
JOIN sys.server_principals sp
ON srm.member_principal_id = sp.principal_id
WHERE role_principal_id = (
SELECT principal_id
FROM sys.server_principals
WHERE NAME = 'sysadmin')
AND ORIGINAL_LOGIN() = sp.NAME)
BEGIN
INSERT INTO DBAWork.dbo.AuditSysAdminLogin
(EventTime, ServerLogin)
VALUES
(GETDATE(), ORIGINAL_LOGIN())
END;
END;
GO
- 排行
- 推荐
- 最新
- C# Socket多线程编程实例
- Asp.net Ajax 中的脚本错误: Sys未定义 的解决方法
- 身份证号码15位升18位(C#)
- DataGrid 控件的使用
- Visual Basic 界面设计大观
- asp.net ajax学习系列功能强大的UpdatePanel控件
- Session丢失问题解决方案
- Javascript与asp.net 实现Ajax多文件无刷新上传
- Web Service描述语言 WSDL 详解(1)--为什么使用WSDL?[转]
- XP下java jdk环境变量设置
- Linux多线程编程
- JSP Struts之HTML标签库详解
- Java GUI:SWT/Swing/AWT的介绍及比较
- C#连接mysql
- asp http 500 - 内部服务器错误 请求的资源在使用中
- 教你在VB中操作 DataGrid 视图
- 关于ASP.NET调用JavaScript的实现
- 使用VB实现Excel自动获取外部数据
- 从资源文件里加载文件(C#)
- 怎样在JAVA文件中获取该项目的相对路径
- Asp.Net Unleashed 2nd Edition 学习笔记 第三部分
- 使用AJAX技术实现网页无闪自动局部刷新
- UpdatePanel与UrlRewrite
- 新手入门:介绍JSP中request属性的用法
- 基于ASP.NET AJAX的WebPart开发与部署
