8 .5 .5 创建操作员
2018-08-04 14:26 笑一笑十年少!!! 阅读(306) 评论(0) 编辑 收藏 举报
操作员是接收有关SQL Server代理作业和警报的通知的对象。操作员可以代表一个人, 也可以代表一个组。操作员没有与数据库或服务器主体关联,但独占SQL Server代理服务。 在本章前面的部分中,我们学习了如何将SQL Server代理服务配置为对警报系统使用数据库 邮件或SQLMail。无论是哪-种配H ,SQL Server代理服务都会将其用来通知合适的操作员。 当创建一个新的操作员时,会给该操作员指定一个姓名,然后定义通知操作员的方式。
可选方式包括电子邮件、使 用 Windows Messenger服务的NET SEND,以及启用了 SMTP
的寻呼程序。
在这个例子中,将为管理员帐户创建一个新的操作员。这个操作员将只能在周末时接
收寻呼。
(1) 在 “对象资源管理器”中,展幵服务器,然后展开“SQLServer代理”节点。
(2) 右 击 “操作员”文件夹,选 择 “新建操作员”命令。
(3) 在“新建操作员”窗口 (如图8-29所示)中,在“姓名”字段中输入Server Administrator。 (4) 确定选中了 “已启用”复选框。
(5) 在 “电子邮件名称”字段中,输入 administrator@adventureworks.com。 (6) 使 “Net send地址”字段保持为空。 (7) 在 “寻呼电子邮件名称”字段中,输入admin-pager@adventureworks.com。
(8) 在 “寻呼值班计划”中设置如下值:
a. 星期五:17:00:00 和 23:59:59 b. 星期六:12:00:00 和 11:59:59 c. 星期日:12:00:00 和 11:59:59
(9) 单 击 “确定”按钮关闭“新建操作员”属性窗口。
如果査看刚才创建的操作员的属性,会发现还有另外两个页面。“通知”页显示一个
已向此操作员发出通知的作业和警报的列表。“历史记录”页则报告了为每一个通知类型进
行最后一次通知尝试的时间。
1. sp一add一operator
使用sp_add_operator创建一个新的操作员。可以使用表8-14中列出的值。
在这个例子中将会创建一个新操作员,他代表Sales Managers组,并且在8:00 AM 到
5:30 PM 之间接收通知:
EXECUTE m sdb. d b o . sp _ a d d _ o p e ra to r @name = 1 S a le s M a n a g e rs', @ em ail_address = ’ S a l e s . M anagers@ adventurew orks. com*, @pager a d d re ss = * S a le s .M a n a g e rs . P ag ersQ ad v en tu rew o rk s.co m ’ , @ w eek d ay _ p ag er_ start_ tim e =080000, @ weekdayjpager_end__t ime =173000, @ pager_days =62;
要将该操作员添加到一个现有的作业,可以使用sp_updateJ o b 存储过程。可以通过该 存储过程指定应该使用为该操作员定义的任意方法通知他。下面的例子将在Poor Performers Report成功时通过电子邮件通知Sales Managers,而在该作业失败时寻呼通知他:
EXECUTE m sdb. d b o . sp _ u p d a te_ j ob @job_name = 1 Poor P e rfo rm e rs R ep o rt *, @ n o tify _ em ail_ o p erato r_ n am e = 1 S a le s M anagers 1 , @ notify_page_operator_nam e = ' S a le s M anagers’ , Q n o tify _ le v e l_ e m a il =1, - - on s u c c e s s @ notify__level_page = 2; - - on f a i l u r e
也可以编辑一个现有作业的属性,在作业成功或失败时通知操作员,或者“当作业完
成时”通知。在这个页面上,还可以将作业配置为把事件写入应用程序日志,并在完成条
件之一满足时自动删除作业。
2 .防故障操作员
创建了至少一个操作员之后,可以指定其中一个作为防故障操作员。防故障操作员是
在 SQL Server运行时其联系信息缓存在内存中的操作员。这可以确保在msdb数据库不可
用时仍可以联系上该操作员。如果无法通知一个作业或警报的主操作员,也可以通知该防
故障操作员。防故障操作员在SQLServer代理属性窗口中定义。在 “警报系统”页上有一 个下拉列表,允许选择一个现有操作员作为防故障操作员,可以使用复选框来确定通知该
操作员的方法。
8 .5 .6 创建警报
“危险,Will Robinson,危险!”—— “赘报”这个词一般会带有这样的负面含义。您可 能会想到高音喇叭大声喊叫,筲报灯人开,然后人们纷纷关门把偎尸关在外面。但是SQL
Server2008中的警报并不意味着世界末日的到来。警报可以只是提供信息,例如让一个经 理知道某销售人员在删除客户表中的某些行。
创建警报分为3 步。
(1) 命名警报。应当使用一个描述性的名称,并可能包含有关触发该警报的事件的严
重性的信息。
(2) 定义触发警报的事件或性能条件。
(3) 指定这个警报的实际行为。它会通知操作员,还是运行一个作业?
警报一般分为3 类:
• 基于事件的警报—— 它们基于数据库或系统级别的事件生成。这些警报可以是系
统定义的,或者可以编写自己的事件。
• 性能条件警报—— 它们使用SQL Server性能计数器表明已达到一个阈值。 • WMI事件—— 可以创建基于WMI事件的警报。
1 .基 于 SQL Server事件的警报
基于SQL Server事件的警报可以根据预定义的SQL Server事件执行一项任务或者通知 操作员。这些事件可以是系统创建的,通常指的是系统范围内的活动;也可以是用户创建
的,允许在一个特定的数据库内定义条件。在了解如何创建警报之前,应学习如何创建事件。
SQL Server事件被定义为一个已执行动作或已满足条件的实例。虽然这个定义听上去 很宽泛,但事件本身的范围就很宽泛。SQL Server 2008已经定义了一些事件。实际上,仅 为英语定义的事件数fi就有大约8900个。这些事件可能在査询包含太多引用表或索引被破 坏时生成。还可以利用SQL Server 2008提供的一种机制,根据需要自己创建系统级或数据 库级的事件。
每个事件都被指定了一个唯一的数字ID、一个严重级别、消息文本和一个语言ID。
严重级别的值介于0〜 25之间,可用来归类事件。
配置为9或 9 以下严重级别的错误消息不会真正引起系统级异常。如果想要针对一个
SQL Server事件创建警报,但又不想把异常抛给调用的应用程序,这会很有用。表 8-15列 出了不同的严重级别和相应的说明。
査 询 sysmessages目录视图可以返回一个在服务器上定义的所有消息的列表。要创建
自己的、可被事件使用的消息,可以使用sp_addmessage存储过程。在使用sp_addmessage
时,可以使用表8-16中列出的值。除非另有说明,所有的值默认为NULL。必需的值只有
@msgnum、@severity ^fl@msgtexto
看一个sp_addmessage存储过程的例子。在这次练习中,创建一个简单的错误消息, 该 消 息 包 含 用 户 向 Sales.CreditCard表添加行时的通知信息。下一步将创建一个向 Sales.CreditCard表插入行的存储过程,然后将执行该 存 储 过 程 。
- - Create the message EXECUTE sp_addmessage @msgnum =60001, (^severity =10, @msgtext = zCredit Card ID #%d has been added by %s as %sz , @with_log = z True*; GO
- - Create a stored procedure for inserting credit card data that will raise —— the error USE AdventureWorks2008;
GO
CREATE PROCEDURE AddNewCreditCard QCardType nvarchar(50), QCardNumber nvarchar(25), @ExpMonth tinyint, @ExpYear smallint
AS
DECLARE Qusername varchar(60) DECLARE @loginame varchar(60) DECLARE @CreditCardInfo Table(CreditCardID INT) DECLARE QCreditCardlD INT SET @loginame =suser_sname() SET ©username =user_name()
BEGIN TRANSACTION
INSERT Sales.CreditCard(CardType,CardNumber,ExpMonth,ExpYear) OUTPUT INSERTED.CreditCardID INTO QCreditCardlnfo VALUES (@CardType,@CardNumber,GExpMonth,@ExpYear); SET QCreditCardID = (Select CreditCardID FROM @CreditCardInfo) RAISERRCR (60001, 10, 1, ^CreditCardID, @loginame, ^username) COMMIT TRANSACTION;
GO
- - Run the stored procedure and return the message EXECUTE AddNewCreditCard @CardType= / Veesa*, @CardNumber=z 111187620190227
、
@ExpMonth=r 2r , @ExpYear=r 2011r
这将生成下列输出:
(1 row(s) affected) Credit Card ID #19238 has been added by AUGHTEIGHT\Administrator as dbo
既然有了一个事件,就应当为其创建一个筲报。在 下 一 个 练 习中将创建一个警报,它
将使用前例中创建的错误消息,并把一个通知发送给Sales Managers操作员: (1) 在 “对象资源管理器”中展开“SQL Server代理”节点。
(2) 右 击 “警报”节点,选 择 “新建警报”命令。
(3) 输入NewCCAlert (如图8-30所示)作为名称。
(4) 确 保 “类型”是 “SQLServer事件膂报”。
(5) 选择 AdventureWorks2008 为数据库。
(6) 在 “将根据以下条件触发瞀报”部分选中“错误号”单选按钮。
(7) 输入60001为错误号。
(8) 切换至“响应”页面。
(9) 选 中 “通知操作员”复选框。
(10) 为 Sales Managers操作员选择电子邮件通知方式。
(11) 切换至“选项”页面。
(12) 在 “膂报错误文本发送方式”下选中“电子邮件”复选框。
(13) 单 击 “确定”按钮。
下面的例子说明了如何使用sp_add_alert存储过程创建一个新警报,以及如何使用 sp_add_notification存储过程将警报与将通知的操作员相关联。因为不能在同一个数据库中 为同一_事件定义两个警报,所以需要先删除上一步创建的NewCCAlert警报。
EXECUTE msdb. dbo. sp__delete_alert @name NewCCAlert*;
EXECUTE msdb.dbo.sp_add_alert Gname = fNew Credit Card Alert*, @message_id =60001, @include_event_description_in =1, @database一name =rAdventureWorks2008z ; EXECUTE msdb.dbo.sp_add_notification @alert_name' = z New Credit Card Alert*, @operator_name =* Sales Managers*, @notification_method =1;
sp_add_alert存储过程包含了大量创建和添加警报的选项。表 8-17列出了所有可用的 参数,但要注意,根据创建的警报类型的不同,不是所有的选项都将被使用。事实上,有
些选项是不能一起使用的。
2 .性能条件警报
性能条件警报使用SQL Server性能对象和计数器,允许根据服务器或数据库活动定义 警报。例如,可以使用性能条件警报在AdventureWOrkS2008数据库的每秒事务数超过一定 值时触发一个警报。在这个例子中,创建-个替报,它会在AdventureWorks2008的事务日 志填充程度超过85%时进行通知:
(1) 在 “对象资源管理器”中展幵“SQLServer代理”节点。
(2) 右 击 “警报”文件夹,选 择 “新建警报”命令。
(3) 输 入 AWXtactLogSpace作为名称(如图8-31所示)。
(4 )选 择 “类型”为 “SQL Server性能条件警报”。
(5) 从 “对象”下拉列表中选择SQLServerDatabases。 (6) 在 “计数器”下拉列表中选择Percent Log Used。 (7) 在 “实例”下拉列表中选择AdventureWorks2008o
(8) 在 “计数器满足以下条件时触发警报”下拉列表中选择“髙于”。
(9) 输入值85。
(10) 选 择 “响应”页面。
(11) 选 中 “通知操作员”复选框。
(12) 为 Server Administrator选择电子邮件和寻呼程序通知方式。
(13) 单 击 “确定”按钮。
现在创建了外新的性能警报,它将在AdventureWorks2008的事务日志的填充程度超 过 85%时通知管理员。另外,也可以创建一个备份和截断事务日志的作业。有关性能对象
和计数器的更多信息参见第10章。
3. WMI事件警报
SQL Server 2008可以使用WMI收集事件来向操作员发出替报。SQL Server使用WMI
Provider for Server Events使自己成为一个可以由WMI管理的对象。任何可生成事件通知
的事件都可由WMI管理。SQL Server瞥报使用WMI查询语言(WMI Query Language, WQL)
为特定的数据库或数据库对象检索事件类型。WQL和 SQL类似,但它具有特定于WMI
的扩展。当为WMI事件创建•个警报时,WMI Provider for Server Events会 把 WMI査询
转换为一个事件通知。WMI提供程序将在msdb数据库中动态创建一个服务和队列。提供 程序从队列中读取数据,并将其以托管对象格式返回到应用程序。
要成功创建WMI事件警报,必须保证WMI Performance Adapter(性能适配器)服务正
在运行。该服务被设置为手动启动,但如果打算将WMI事件警报作为管理解决方案的一
部分,那么可能想要把该服务配置为自动启动。另外,要确保在msdb数据库以及任何将
通过WMI管理的数据库中启用了 Service Broker服务。
WMI是一个很强大也很复杂的工具。使用WMI时,可以通过WMI筲报监视一些不
同的数据定义语言(DDL)和跟踪事件。要了解可监视的事件,可阅读“联机丛书”中的“WMI
Provider for Server Events 类和属性”主题。
• 复制合并
• 复 制 列 读取器
• 复制快照
• 复制事务•日志读取器
• Analysis Services 命令 • Analysis Services 査询
• 执 行 SSIS包
• PowerShell
另外还有一个用来创建和管理未指派代理的文件夹。注意,如有需要,一 个 代 理可以
用于多个任务类型。
创建一个新代理
现在看一下创建一个新代理的过程。首先,代理使用凭据执行。在 第 6 章中,我们学
习了如何创建一个新的凭据,但如果您删除了它或者您并没有逐页阅读本书,那么现在可
以创建一个新凭据。首先创建一个新的Windows用户: (1) 导 航 至 “本地用户和组”文件夹。这个文件夹可能会因为使用的操作系统不同而
有所变化。
(2) 展 开 “本地用户和组”文件夹,选 择 “用户”文件夹。
(3) 右 击 “用户”文件夹,选 择 “新用户”命令。
(4) 在 “用户名”文本框中输入ScriptRunner。
(5) 输 入 P@sswOrd作为密码,取 消 选 中 “用户下次登录时须更改密码”复选框。 (6) 单 击 “创建”按钮。
(7) 单 击 “关闭”按钮。
(8) 关 闭 “服务器管理器”窗口(或“计算机管理”窗口,这取决于使用的操作系统)。
既然有了一个新用户,现在为该用户创建-个凭据:
(1) 回到 SQL Server Management Studio。
(2) 在 “对象资源管理器”中展开服务器,然 后 展 开 “安全性”节点。
(3) 右 击 “凭据”文件夹,选 择 “新建凭据”命令(如图8-32所示)。
(4) 输入ActiveXProxy作为凭据名称。
(5) 在 “标识”框 中 输 入 AughtEight\ScriptRunner(或使用您的服务器和域名称替代
AughtEight)o
(6) 在 “密码”字 段 和 “确认密码”字段中输入P@ssw0rd。 (7) 单 击 “确定”按钮。
这样服务器卜.就有了一个带有关联凭据的新Windows用户。现在可以使用该凭据创建 一个或多个代理:
(1) 在 “对象资源管理器”中 展 开 “SQL Server代理”节点。 (2) 展 开 “代理”节点,选 择 “ActiveX脚本 ”文件夹。
(3) 右 击 “ActiveX脚本”文件夹,选 择 “新建代理”命令。
(4) 输 入 ScriptRunner作为代理名称(如阁8-33所示)。
(5) 输 入 ActiveXProxy作为凭据名称。
(6) 确保在“对以下子系统有效”部分中选中“ActiveX脚本”复选框。 (7) 可添加其他子系统,或 使 用 “主体”页指定可在作业创建中引用该代理的SQL
Server登录名、服务器角色或msdb数据库角色。 (8) 单 击 “确定”按钮。
既然己经创建了一个新代理,现在看看如何在作业步骤中使用它。下一个例子将向
Poor Performers Report作业添加一个新作业步骤,它将包含一个ActiveX脚本。虽然这个
脚本没有什么实用价值,但是可以有效地帮助解释概念。
EXECUTE msdb.dbo.sp add_j obstep @job_name = 'Poor Performers Report', @step_id -2, @step_name = * Hello World*, ^subsystem = rACTIVESCRIPTING', @database__name =* VBScript *, @command ='Sub main() Print ("Hello World.M ) End Sub', @on_success_action =3, @proxy_name = * ScriptRunner *;
现在可以执行该作业并査看作业历史记录,了解ScriptRunner的脚本是否成功执行。