zoukankan      html  css  js  c++  java
  • SQL Server 2008新特性——策略管理

    策略管理是SQL Server 2008中的一个新特性,用于管理数据库实例、数据库以及数据库对象的各种属性。策略管理在SSMS的对象资源管理器数据库实例下的“管理”节点下,如图:

    image

    从图中可以看到,策略管理中包含三个节点:策略、条件、方面。

    方面就是策略要应用的对象,包括:服务器、表、触发器、视图、存储过程……这些方面对象都是系统定义好了的,仅供瞻仰不可更改。双击具体的某一个方面可以查看该方面的属性,在定义条件时即可对这些属性进行判断,如图为存储过程方面的属性。

     

    条件就是一个布尔表达式判断策略是否为真。

    策略就是在条件为假的情况下要执行的操作,即评估模式。策略中的评估模式有4种:按需、按计划、更改时记录和更改时禁止。对于这4种模式,官方给出如下定义:

    • 按需。当用户直接指定这种模式时,它可对策略进行评估。
    • 更改时: 禁止。这种自动模式使用 DDL 触发器来防止违反策略。
    • 更改时: 仅记录。当发生相关更改并违反日志策略时,这种自动模式使用事件通知对策略进行评估。
    • 按计划。这种自动模式使用 SQL Server 代理作业定期对策略进行评估。此模式记录违反策略的情况。

      其中按需是手动操作的,其他三个则可以自动完成。按计划是使用SQL Server代理来定时检查策略,另外两个是在更改时由DDL触发器触发。

      其他的概念我不用多说,大家可以看联机丛书,这里就举个例子来说明策略管理的使用。

      假设现在我们要开发个业务系统,其数据库为TestDB1,使用ADO.NET 调用存储过程来实现数据操作,现在项目中规定存储过程的命名规范:以“usp_”开头。这里我们可以使用策略管理来实现对该规范的检查或强制实行。具体操作过程如下:

      (1)由于我们针对的对象是存储过程,所以在“方面”节点下右击“存储过程”,选择“新建条件”选项,系统将会弹出新建条件的窗口。

      (2)输入“条件”的名称:“存储过程命名规范”,然后字段列表中选择@Name,运算符为LIKE,值为'usp[_]%'。也就是判断存储过程的名字LIKE 'usp[_]%',也就是以“usp_”开头的SQL表达。如图:

      image

      这里字段和值都可以使用变量和函数,如果允许“USP_”、“Usp_”等开头的存储过程,则可以将字段运用小写函数,改写为“Lower(@Name)”,然后单击“确定”按钮,创建“条件”完成。

      (3)右击“策略”节点,在右键菜单中选“新建策略”选项,系统将打开新建策略窗口,输入策略名“检查存储过程命名规范”,在检查条件的下拉列表中选择刚创建的条件“存储过程命名规范”,系统将根据选择的检查条件列出针对目标,默认情况下是对每个数据库的每个存储过程进行检查,由于这里我们只希望检查TestDB1数据库,所以需要新建数据库的条件,如图:

      image

      (4)单击“新建条件”后将出现与第(2)步新建条件相同的窗口,只是这里我们新建的条件方面是数据库,新建条件TestDB1,如图所示:

      image

      (5)单击“确定”按钮回到新建策略窗口,针对目标变成了对TestDB1数据库的每个存储过程。这里若要强制实现这个策略,则选择评估模式为“更改:禁止”并选中“已启用”复选框表示启用该策略。

      (6)单击“说明”选择页,可以在其中选择策略的类别、在违反策略时给出的友好说明。最后单击“确定”按钮即可完成策略的创建工作。

      (7)接下来就是测试该策略是否有效了,运行如下SQL语句创建一个存储过程usp_GetDate:

      USE TestDB1
      GO
      CREATE PROC usp_GetDate
      AS
      SELECT GETDATE()
      GO

      一切正常,存储过程被创建成功。那么再创建一个存储过程db1_GetDate:

      USE TestDB1
      GO
      CREATE PROC db1_GetDate
      AS
      SELECT GETDATE()
      GO

      哈哈,系统抛出异常了:

      “SQLSERVER:SQLMS-ZYDEFAULTDatabasesTestDB1StoredProceduresdbo.db1_GetDate”已违反策略“检查存储过程命名规范”。
      此事务将回滚。
      策略条件:“Lower(@Name) LIKE 'usp[_]%'”
      策略说明:“项目中统一了TestDB1数据库中存储过程的命名规范,所有存储过程必须以usp_开头”
      其他帮助:“存储过程必须以usp_开头”:“”
      语句:“CREATE PROC db1_GetDate
      AS
      SELECT GETDATE()
      ”。
      消息 3609,级别 16,状态 1,过程 sp_syspolicy_dispatch_event,第 65 行
      事务在触发器中结束。批处理已中止。

      再看看对象资源管理器中,该存储过程确实没有被创建。同样可以在另外的数据库中创建这两个存储过程,但是由于策略中针对的是TestDB1数据库,所以在其他数据库中这两个存储过程都将会被成功创建。

      现在有了这个策略,大家在命名存储过程时都必须按照规范来了。

      如果策略被定义为“按需”评估模式的话,则用户可以在其中创建违反策略的存储过程。若要检查现有的数据库对象是否符合策略,只需要在对象资源管理器中右击数据库对象节点,然后选择右键菜单中的“策略”下的“评估” 选项,如果要检查具体某个数据库对象的“方面”属性值的话,则选择右键菜单中的“方面”选项。

      选择“评估”选项后系统弹出评估策略窗口,其中列出了所有存储过程方面相关的策略,选择需要验证的策略,然后单击“评估”按钮即可查看当前数据库对象是否符合策略。

       

      这里只是一个简单的示例而已,策略管理的功能远不止命名规范的检查这么简单,通过策略管理还可以检查数据库是否自动收缩、SQL Server的密码策略、网络数据表大小、最大并行度……

      微软为我们提供了一个安装包,其中包含了大量的策略示例,帮助大家学习和使用基于策略的管理,下载地址:

      http://go.microsoft.com/fwlink/?LinkId=123720&clcid=0x804

    【出自博客园深蓝居,转载请注明作者出处】

  • 相关阅读:
    UVa532 Dungeon Master 三维迷宫
    6.4.2 走迷宫
    UVA 439 Knight Moves
    UVa784 Maze Exploration
    UVa657 The die is cast
    UVa572 Oil Deposits DFS求连通块
    UVa10562 Undraw the Trees
    UVa839 Not so Mobile
    327
    UVa699 The Falling Leaves
  • 原文地址:https://www.cnblogs.com/qanholas/p/3229799.html
Copyright © 2011-2022 走看看