策略管理用于管理数据库实例、数据库以及数据库对象的各种属性,Policy Management 位于Management Catalog下,
一,Basic concepts
引用园子里深蓝的博客《SQL Server 2008新特性——策略管理》解释Basic concepts: Policy,condition 和 facet。
策略管理中包含三个节点:策略、条件、方面。
方面就是策略要应用的对象,包括:服务器、表、触发器、视图、存储过程……这些方面对象都是系统定义好了的,仅供瞻仰不可更改。双击具体的某一个方面可以查看该方面的属性,在定义条件时即可对这些属性进行判断。
条件就是一个布尔表达式判断策略是否为真。
策略就是在条件为假的情况下要执行的操作,即评估模式。策略中的评估模式有4种:按需、按计划、更改时记录和更改时禁止。对于这4种模式,官方给出如下定义:
其中按需是手动操作的,其他三个则可以自动完成。按计划是使用SQL Server代理来定时检查策略,另外两个是在更改时由DDL触发器触发。
二,Example1,规范Stored Procedure 的命名,必须以"usp_"开头, 命名规范是: sp_name like 'usp[_]%'。
Step1,选择对应的Facet,查看属性
由于我们针对的对象是Stored Procedure,所以从Facets中 选中Stored Procedure,查看Facet 属性,在properties列表中有Name 属性,表示object name。
step2,创建Condition
Condition就是一个boolean 表达式,可以使用SQL Server 支持的任何operatior。
1,右击Facet,弹出快捷菜单,点击New Condition...,进入 Create new condition wizard。
2,填写Facet的name属性,命名为SP_NameCondition。
Facet 是Stored Procedure,Facet 属性直接决定了Expression Grid的Filed 列表的Items。
从Expression Grid中Field中选择@Name。
3,点击Field 后面的ellipsis,弹出Advanced Edit,能够对@Name进行编辑,如果允许“USP_”、“Usp_”等开头的存储过程命名,那么可以将Cell Value改写为“Lower(@Name)”。
在Properties 和 functions 中有对应的Facet的Properties 和 Functions,在details中,有对Properties 和 functions的描述和使用Example。
4, Operator 选择LIKE
Value 填写'usp[_]%',点击value后面的ellipsis,能够弹出Advanced Editor,对Value值进行编辑。
step3,Create Policy
1,输入Policy的Name为SP_NamePolicy,Check Condition选择 SP_NameCondition
2,Against Targets
我们针对的不是所有的SP,而是用户自定义的SP,点击 Stored Procedure 前面的下三角,不使用Every,而选择new condition。
我们针对的是db_study 这个db下的所有User Defined Stored procedure,再创建一个Facet 为Database的Condition。
3,Evaluation Mode
Evaluation Mode 有四种,选择On change:prevent,并勾选 Enable checkbox。
点击OK,弹出错误消息,不支持Evaluation Mode “On Change:Prevent”,Object Set 是指StoredProcedure的集合,将SP_Name_NotSystemSP这个condition换成 Every,适用于所有的SP。然后点击OK,创建成功。
step4,查看创建的Policy 和condition
Step5,测试Policy
1,创建一个sp,命名不符合Policy
CREATE PROCEDURE dbo.sp_test_policy AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; -- Insert statements for procedure here select top 11 * from sys.objects END GO
创建失败,错误消息是:violate policy,创建SP的事务回滚,创建失败。
Policy 'SP_NamePolicy' has been violated by 'SQLSERVER:\SQL\SQLServerInstanceName\DEFAULT\Databases\db_study\StoredProcedures\dbo.sp_test_policy'. This transaction will be rolled back. Policy condition: 'Lower(@Name) LIKE 'usp[_]%'' Policy description: '' Additional help: '' : '' Statement: 'CREATE PROCEDURE dbo.sp_test_policy AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements....'. Msg 3609, Level 16, State 1, Procedure sp_syspolicy_dispatch_event, Line 65 The transaction ended in the trigger. The batch has been aborted.
2,创建一个sp,命名符合policy,commands completed successfully。
三,Example2: 强制Table 或Index 必须使用Data Compression Policy。
从Example1中,我们可以看出,选择 Appropriate Facet 非常重要。在table facet中,存在属性 HasCompressedPartitions 和 RowCount,属性HasCompressedPartitions返回的boolean表示Table 或 index是否压缩,RowCount属性返回table的数据行数。
step1,Create Condition
当表的数据行数大于1000000,必须进行数据压缩。当对Policy evaluate时,如果 @RowCount>1000000 and @HasCompressedPartitions=true,那么 comply with policy;如果 @RowCount>1000000 and @HasCompressedPartitions=true 不满足,即@RowCount<=1000000 or @HasCompressedPartitions=false,那么 violate policy。
所以,Check Condition 的Expression 是 @RowCount<=1000000 or @HasCompressedPartitions=false。
step2,Create Policy
Evaluation Mode选择 On Demand。
Step3,查看Policy management
step4,Evaluate Policy
查看Policy Evaluation的结果,DB中的所有tables 满足 Check condition
四,对Individual object 进行Policy Evaluate
1,选择一个Table,右击弹出快捷菜单,有Policies 和facets 子菜单,点击Evaluate
2,选择Policy,对Individual table 进行Evaluate
3,查看Evaluation Result
推荐文档:
SQL Server 2008新特性——策略管理