如何在SQL Server中添加WMI alert

SQL Server可以支持WMI alert,因此我们可以使用WMI event 来监控SQL Server中的某些事件发生,并在此时出发SQL Server alert,指定执行我们需要的语句。

以下是WMI alert的一个示例脚本:IF OBJECT_ID('DeadlockEvents', 'U') IS NOT NULL

BEGIN

&">nbsp;   DROP TABLE DeadlockEvents ;

END ;

GOCREATE TABLE DeadlockEvents

    (AlertTime DATETIME, DeadlockGraph XML) ;

GO

-- Add a job for the alert to run.EXEC  msdb.dbo.sp_add_job @job_name=N'Capture Deadlock Graph',

    @enabled=1,

    @description=N'Job for responding to DEADLOCK_GRAPH events' ;

GO-- Add a jobstep that inserts the
current time and the deadlock graph into

-- the DeadlockEvents table.EXEC msdb.dbo.sp_add_jobstep

    @job_name = N'Capture Deadlock Graph',

    @step_name=N'Insert graph into LogEvents',

    @step_id=1,

    @on_success_action=1,

    @on_fail_action=2,

    @subsystem=N'TSQL',

    @command= N'INSERT INTO DeadlockEvents

                (AlertTime, DeadlockGraph)

                VALUES (getdate(), N''$(ESCAPE_SQUOTE(WMI(TextData))))',

    @database_name=N'AdventureWorks' ;

GO-- Set the job server for the job to the current instance of SQL Server.EXEC msdb.dbo.sp_add_jobserver @job_name = N'Capture Deadlock Graph' ;

GO-- Add an alert that responds to all DEADLOCK_GRAPH events for

-- the default instance. To monitor deadlocks for a different instance,

-- change MSSQLSERVER to the name of the instance.EXEC msdb.dbo.sp_add_alert @name=N'Respond to DEADLOCK_GRAPH',

@wmi_namespace=N'\\.\root\Microsoft\SqlServer\ServerEvents\MSSQLSERVER',

    @wmi_query=N'SELECT * FROM DEADLOCK_GRAPH',

    @job_name='Capture Deadlock Graph' ;

GO 这个脚本是用WMI事件来监控SQL Server有没有deadlock 发生,如果发生了deadlock,就调用一个job,把相关的内如写入我们事先创建好的表中。 在SSMS
里面用图形
界面创建WMI alert如下:这两种方式都需要指定SQL Server WMI的namespace。我们可以从这里得到当前SQL实例的WMI namespace的路径: 
那么,创建WMI alert的过程究竟是怎样的呢?SQL Server的WMI event provider 包含在Sqlwep100.dll 中。在我们创建WMI alert时,WMI service需要先将Sqlwep100.dll 装载并且初始化。当SQL Server 调用WMI query的时候,会有一个对应的WMIPRVSE.exe 被启动。WMIPRVSE.exe 启动后,装载Sqlwep100.dll并且做provider 初始化,初始化包含以下几个过程:a.    sqlwep100!CSQLServerEventProvider::Initialize  --开始初始化 b. sqlwep100!CSQLServerEventProvider::HrConnectToSQL---连接SQL Server master databasec. sqlwep100!CSQLServerEventProvider::FIsServiceBrokerEnabled –检查 MSDB上”broker enabled”有没有启用d. sqlwep100!CSB
Deployment::Create
DeploymentIfNecessary –创建WMI alert 在SQL Server中所需要的对象。 对于我们文中的实例,需要创建以下对象:IF NOT EXISTS(select * from sys.service_queues where name='WMIEventProviderNotificationQueue') CREATE QUEUE WMIEventProviderNotificationQueue; IF NOT EXISTS(select * from sys.services where name='SQL/Notifications/ProcessWMIEventProviderNotification/v1.0') CREATE SERVICE [SQL/Notifications/ProcessWMIEventProviderNotification/v1.0] ON QUEUE WMIEventProviderNotificationQueue( [http://schemas.microsoft.com/SQL/Notifications/PostEventNotification] ); IF NOT EXISTS(select * from sys.server_event_notifications where name='SQLWEP_RECHECK_SUBSCRIPTIONS') CREATE EVENT NOTIFICATION SQLWEP_RECHECK_SUBSCRIPTIONS ON SERVER WITH FAN_IN FOR A
LTER_LOGIN, DROP_LOGIN, ALTER_USER, DROP_USER, ADD_ROLE_MEMBER, DROP_ROLE_MEMBER, ADD_SERVER_ROLE_MEMBER, DROP_SERVER_ROLE_MEMBER, DENY_SERVER, REVOKE_SERVER, DENY_DATABASE, REVOKE_DATABASE TO SERVICE 'SQL/Notifications/ProcessWMIEventProviderNotification/v1.0', 'current database';SELECT service_broker_guid FROM sys.databases WHERE name='msdb'从windows的task manager中我们可以观察到,SQL Server对应的WMIPRVSE.exe 的启动用户是system. 从SQL Server 2008 开始, builtin\administrator 用户组默认已经从SQL Server的login中移除了。 在上述列出的a, b, c, d 四个步骤中,b, d 两个步骤都可能会遇到权限问题。b.    连接SQL Server master database—我们需要将NT AUTHORITY\SYSTEM 加入到SQL login中,并且grant “public”用户组c.       MSDB的”broker enabled” 启用: d.      执行创建对象的脚本需要给用户NT AUTHORITY\SYSTEM赋予以下权限:use [master]GOGRANT ALTER ANY EVENT NOTIFICATION TO [NT AUTHORITY\SYSTEM]GOuse [master]GOGRANT AUTHENTICATE SERVER TO [NT AUTHORITY\SYSTEM]GOuse [master]GOGRANT CONTROL SERVER TO [NT AUTHORITY\SYSTEM]GOuse [master]GOGRANT CREATE DDL EVENT NOTIFICATION TO [NT AUTHORITY\SYSTEM]GOuse [master]GOGRANT CREATE TRACE EVENT NOTIFICATION TO [NT AUTHORITY\SYSTEM]GOuse [master]GOGRANT VIEW ANY DEFINITION TO [NT AUTHORITY\SYSTEM]GOuse [master]GOGRANT CONTROL ON LOGIN::[ SQL_starting_account] TO [NT AUTHORITY\SYSTEM]GOuse [master]GOGRANT IMPERSONATE ON LOGIN::[ SQL_starting_account] TO [NT AUTHORITY\SYSTEM]GOuse [master]GOGRANT VIEW DEFINITION ON LOGIN::[ SQL_starting_account] TO [NT AUTHORITY\SYSTEM]GO

时间: 2024-10-26 05:31:45

如何在SQL Server中添加WMI alert的相关文章

如何在SQL Server中构建数据仓库

[导读]本文介绍如何在SQL Server中构建简单的数据仓库,并分析相关的问题. 基本概念: 1.多维数据集:多维数据集是联机分析处理 (OLAP) 中的主要对象,是一项可对数据仓库中的数据进行快速访问的技术.多维数据集是一个数据集合,通常从数据仓库的子集构造,并组织和汇总成一个由一组维度和度量值定义的多维结构. 2.维度:是多维数据集的结构性特性.它们是事实数据表中用来描述数据的分类的有组织层次结构(级别).这些分类和级别描述了一些相似的成员集合,用户将基于这些成员集合进行分析. 3.度量值

如何在SQL Server中恢复数据

server|恢复|数据 在SQL server 中恢复数据的几种办法: 1.自然就是 backup 的 恢复方法 backup 这种方法是最安全,最可靠的方法操作起来也很简单,只要在 sql server 的 enterprise manager中选择 restore 就可以了. 用T-SQL 也可以完成: RESTORE DATABASE test FROM DISK = 'c:\mssql7\backup\test.bak' 当然这是用的 文件恢复,如果是 设备恢复 自然也是可以的. 2.

如何在SQL Server中实现 Limit m,n 的功能_Mysql

在MySQL中,可以用 Limit 来查询第 m 列到第 n 列的记录,例如: 复制代码 代码如下: select * from tablename limit m, n 但是,在SQL Server中,不支持 Limit 语句.怎么办呢?解决方案:虽然SQL Server不支持 Limit ,但是它支持 TOP.我们以SQL Server 2005为例,就以它自带的示范数据库 AdventureWorks 作为测试数据: 复制代码 代码如下: select id from tablename

如何在SQL Server中使用相关子查询

子查询是指将一条SQL Sever语句嵌入到另一条SQL Sever语句中.数据库引擎将子查询做为虚表执行查询操作.子查询可做为连接语句中的一个表,可做为选择语句中的一个值,也可以是SQL Sever查询子句,还可以是SQL Sever查询子句的字句,与数据操作语句混合在一起. 子查询的执行依赖于嵌套查询.查询树从最里层开始,一层一层向外执行.高层的嵌套查询可以访问低层嵌套查询的结果. 什么是相关子查询? 与经典子查询不同,相关子查询依赖于外部查询.外部查询和子查询是有联系的,尤其在子查询的WH

如何在SQL Server中由原子建立分子查询

每位SQL Server开发员都有自己的首选操作方法.我的方法叫做分子查询.这些是由原子查询组合起来的查询,通过它们我可以处理一个表格.将原子组合起来,可以建立分子.当然也会有限制(化学家所称的化合价),但一般来说,这个原理还是适用的. 在本文中,我将探讨这种策略的几种变化.我从最基本的内容开始(即最详细的内容),然后逐步深化.为让你了解这种方法的灵活性,我会在不同层次使用几种技巧.(警告:这并不是唯一的解决方法,我只是在讨论一些可行的选择.) 我从普遍使用的数据库Northwind开始(虽然为

如何在SQL Server中保存和输出图片

server 建表 为了试验这个例子你需要一个含有数据的table(你可以在现在的库中创建它,也可以创建一个新的数据库),下面是它的结构: Column Name Datatype Purpose ID Integer identity column Primary key IMGTITLE Varchar(50) Stores some user friendly title to identity the image IMGTYPE Varchar(50) Stores image cont

技巧:如何在SQL Server中创建全局临时表

全局临时表的生命周期一直持续到创建会话(不是创建级别)才终止.例如,如果你在存储过程中创建 全局临时表,当超出存储过程的范围时,该表并不会被销毁.当创建会话终止后,Sql Server才会自动尝 试删除该表,其他会话中对其提交的所有语句都将结束,并释放它们所保持的所有锁. 但在某些情况下,你可能想创建一个不属于任何会话的全局临时表.这时,无论哪个会话打开或关闭 ,它总数存在,只有显式的删除它才能被移除.为此,可以在一个特殊的存储过程中(使用sp_前缀,在 master中创建)创建该表并使用"st

如何在SQL Server中对行进行动态编号

如何在SQL中对行进行动态编号,加行号这个问题,在数据库查询中,是经典的问题.我把现在的方法整理一下,分享一下技巧吧.代码基于pubs样板数据库.在SQL中,一般就这两种方法: 1.使用临时表 可以使用select into 创建临时表,在第一列,加入Identify(int,1,1)作为行号,这样在产生的临时表中,结果集就有了行号.也是目前效率最高的方法.这种方法不能用于视图 代码: set nocount onselect IDentify(int,1,1) 'RowOrder',au_ln

如何在 SQL SERVER 中快速有条件删除海量数据_MsSql

最近有个朋友问我,他说他在SQLSERVER删除几百万到几千万数据是显的很慢,帮他分析了一下,提了一些以下意见,或许对很多人有用.     如果你的硬盘空间小,并且不想设置数据库的日志为最小(因为希望其他正常的日志希望仍然记录),而且对速度要求比较高,并清除所有的数据建议你用turncate table1,因为truncate 是DDL操作,不产生rollback,不写日志速度快一些,然后如果有自增的话,恢复到1开始,而delete会产生rollback,如果删除大数据量的表速度会很慢,同时会占