65.9K
CodeProject 正在变化。 阅读更多。
Home

基于策略的管理在 SQL Server 2008 中

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.50/5 (3投票s)

2011 年 5 月 13 日

CPOL

7分钟阅读

viewsIcon

32219

SQL Server 2008 提供了一个非常高效的 SQL 策略管理员,它持续监控服务器并适当地报告错误。管理员可以定义策略并通过评估策略来确保其得到遵守。

引言

我们当中有多少人喜欢规则?想象一下排队买电影票,如果我们能直接跳到售票窗口的第一位,那会不会更好?小时候,我记得爸爸说“晚上 10 点睡觉,不能熬夜”,我感到很难受,并质疑为什么不能看深夜电影。你所在组织关于周五穿休闲装的政策呢?感谢上帝,我们至少可以在办公室穿一天牛仔裤!如果我在字典中查找“策略”一词,它会说:“由组织的管理机构制定并执行的一套基本原则和相关准则,以指导和限制其为实现长期目标而采取的行动。”为什么管理机构(国家/组织/甚至是父亲)需要执行规则和准则?对此,他们会很容易地说:“为了给我们的生活带来纪律。”要进步,就需要纪律,而策略则确保人们有纪律。

那么服务器上托管的数据库之间的纪律呢?MS SQL Server 2008 提供了一个非常重要的基于策略的管理功能。在本文中,我们将探讨策略的配置、监控和评估。让我们假设一个组织中的 DBA 为开发人员设置了指导方针;他说每个用户定义的存储过程都应该以“usp_”为前缀(例如 usp_TestProc),或者用户定义的表应该以“tbl_”为前缀(例如 tbl_TestTable)。直到 SQL Server 2005,DBA 必须手动检查开发人员的代码是否满足其先决条件,但 SQL Server 2008 使事情变得更容易。SQL Server 2008 提供了一个非常高效的 SQL 策略管理员,它持续监控服务器并适当地报告错误。管理员可以定义策略并通过评估策略来确保其得到遵守。

  • 按需
  • 按计划
  • 按更改:仅记录
  • 按更改:阻止

策略管理:仔细研究

在 SSMS 的管理文件夹下打开,我们可以找到策略管理。策略管理允许为各种方面创建具有指定条件的策略。

  • 方面:方面是 SQL Server 的属性,策略将考虑管理该属性。有几个方面可以实施策略。例如,我们将使用“数据库选项”方面来实施一项策略,该策略将确保服务器上所有托管数据库的 AutoShrink 选项都应为 TRUE。同样,我们将在“存储过程”方面创建策略。
  • 条件:它是评估方面的标准。在为服务器设计策略时,第一步是创建由策略评估该方面的条件。
  • 策略:正如字典所说,我重新定义,SQL Server 策略是由服务器的策略管理器制定并执行的一套基本原则和相关准则,用于使所需的服务器方面符合要求,从长远来看,这将保持服务器的一致性并帮助 DBA 实现组织级别的 IT 规范。

示例 1

场景:我们将创建一个按需策略,以确保所有数据库都将 Auto Shrink 选项设置为 True。默认情况下,创建的数据库的 Auto Shrink 设置为 False如下图所示。

步骤 1:创建条件

右键单击“条件”并选择“新建条件…”

接下来,为条件提供一个名称:“检查自动收缩”,然后从“方面”下拉列表中选择“数据库选项”作为方面。在表达式编辑器中,从下拉列表中选择字段“@AutoShrink”,选择运算符“=”,然后选择值“True”。

此条件将检查所有数据库的自动收缩属性是否为 true。

点击“确定”。

步骤 2:创建策略

右键单击“策略”并选择“新建策略…”

提供名称“AutoShrinkPolicy”;从“检查条件”下拉列表中,选择我们刚刚创建的条件。从“目标”中,勾选每个数据库,因为我们希望每个数据库都符合此策略。

接下来是评估模式。在此示例中,我们将其保持为“按需”。按需意味着我们将根据自己的意愿评估策略,而不是在预定的时间表上。

点击“确定”。

一切就绪,策略已到位。

步骤 3:评估

我们已经能够创建策略;现在我们将让策略管理器评估该策略。要评估,右键单击策略“AutoShrinkPolicy”并单击“评估”。SQL Server 评估并列出结果,如以下屏幕截图所示。由于我的数据库中没有一个数据库的“自动收缩”为 True,因此我的服务器上托管的每个数据库都存在不符合项。

为了使结果符合策略,请对照数据库进行检查并单击“应用” 按钮。

这会将 TestDB 的自动收缩属性设置为 True,绿色标志表示其符合性。

示例 2

场景:场景是确保服务器上创建的每个用户定义存储过程都以“usp_%”为前缀。让我们为此设计一个策略。

步骤 1:创建条件

右键单击“条件”并选择“新建条件…”

接下来,为条件提供名称“CheckProcName”,然后从“方面”下拉列表中选择“存储过程”作为方面。在表达式编辑器中,从下拉列表中选择字段“@Name”,选择运算符“LIKE”,然后选择值“usp_%”。

此条件将检查所有存储过程的名称是否以 usp_ 为前缀。

点击“确定”。

步骤 2:创建策略

右键单击“策略”并选择“新建策略…”

提供名称“ProcPolicy”;从“检查条件”下拉列表中,选择我们刚刚创建的条件,即 CheckProcName。从“目标”中,勾选每个数据库中的每个存储过程,因为我们希望每个存储过程都符合此策略。

接下来是评估模式。在此示例中,我们将其保持为“按更改:阻止”。按更改:阻止将评估任何进一步的过程创建的策略,并阻止其创建,除非其符合策略。

另外,请务必勾选“已启用”复选框,然后单击“确定”。

步骤 3:评估

我们已经能够创建策略,现在让策略管理器评估该策略。要评估此策略,请打开 SSMS 查询分析器并尝试在任何数据库下创建 SP。

CREATE PROCEDURE TestProcPolicy
AS
BEGIN
PRINT 'HELLO WORLD !'
END

执行过程后,我们收到以下错误

Policy 'ProcPolicy' has been violated by 
   'SQLSERVER:\SQL\Tk99-1342-311\DEFAULT\Databases\
   master\StoredProcedures\dbo.TestProcPolicy'.
   
This transaction will be rolled back.
Policy condition: '@Name LIKE 'usp_%''
Policy description: ''
Additional help: '' : ''
Statement: 'CREATE PROCEDURE TestProcPolicy
AS
BEGIN
PRINT 'HELLO WORLD !'
END'.
Msg 3609, Level 16, State 1, Procedure sp_syspolicy_dispatch_event, Line 65
The transaction ended in the trigger. The batch has been aborted.

让我们尝试使用以下命令重新执行 SP

CREATE PROCEDURE usp_TestProcPolicy
AS
BEGIN
PRINT 'HELLO WORLD !'
END
----
Command(s) completed successfully.

通过这两个示例,我希望我能够以初学者级别解释策略管理。

摘要

总而言之,制定策略是为了确保遵守规则和准则。直到 SQL Server 2005,策略实施是一项艰巨的任务,DBA 必须手动完成(借助触发器等),但 SQL Server 2008 的引入使 DBA 的生活变得更加轻松(字面上)。创建和实施策略变得更加容易、更快、更可靠。所需做的就是首先创建一个“条件”,这无非是要遵循的准则或规则,然后创建策略以遵守此条件,瞧,我们有了策略。策略可以在数据库的各种“方面”上创建,例如数据库、表、存储过程等。

策略可以是按需的、按计划的,或按更改的(仅记录或阻止)。

在结束本文之前,一个常见问题

有人问,使用策略管理我们可以限制用户为过程遵循特定的命名约定,这很棒。但我们不能对表名做同样的事情。我尝试设置这个,但只得到两种评估模式(按计划和按需)。我没有得到“按更改:阻止”,有没有办法在策略管理中实现这一点?

是的,先生,有的:)

例如,如果我想创建一个策略来限制表命名,我可以使用以下方面

  1. 表格
  2. 名称
  3. 多部分名称等。

虽然前两个不提供“按更改:阻止”选项,但最后一个提供,可以选择阻止不符合现有策略的表命名。关键在于探索;有很多方面,但要找出哪个适合需求需要一番思考。

© . All rights reserved.