策略管理
策略管理(Policy Management)实际上是一个评估和监控系统,而评估和监控的规则由用户定义,用于管理数据库实例、数据库以及数据库对象的各种属性,使用基于策略的管理,用户能够有效地评估、监视以及管理数据库系统。继承了SSMS一贯简单易用的作用,使用策略管理的向导,能够非常简单地对数据库系统进行策略管理。
一,策略管理的基本概念
1,策略管理包含的基本组件:策略(Policy)、条件(Condition)、方面(Facet)和目标(Targets):
- 方面(Facet):是策略评估和检查的项目,每个Facet都定义了大量的属性,方面对象是系统预定义的;用户在进行策略管理时,必须首先查看系统是否预定义了相应的Facet,根据Facet的属性创建相应的管理策略;
- 条件(Condition):是一个布尔表达式,在条件中引用方面对象的属性,用于判断策略是否为真;
- 目标(Target):是策略作用的对象,包括服务器、数据库、Login、表、存储过程以及其他数据库对象;
- 策略(Policy):策略将目标和条件关联,并定义评估的模式,在条件(Check Condition)为假时,根据评估模式执行相应的操作,或回滚事务,或记录异常消息;
2,评估模式
策略的评估模式有4种:按需、按计划、更改时记录和更改时禁止。对于这4种模式,官方给出如下定义:
- 按需(On Demand):当用户指定这种模式时,DBA可以手动调用策略来评估发面是否满足条件;
- 更改时-禁止(On Change - Prevent):最严格的评估模式,SQL Server自动使用 DDL 触发器来检查用户对方面的更新操作是否违反策略,如果违反策略则回滚该操作,以达到强制策略的效果;
- 更改时-仅记录(On Change - Log Only):SQL Server自动检查用户对方面的更新操作是否违反策略,如果违反策略则发送消息,仅仅记录违反侧露的日志消息。
- 按计划(On Schedule):该模式使用 SQL Server 代理作业定期对目标对象进行策略评估,并记录违反策略的情况;
其中按需是手动操作的,其他三个可以自动执行。按计划是使用SQL Server代理来定时检查策略,另外两个是在更改时由DDL触发器触发。
3,在SSMS中查看和管理策略
策略管理位于管理目录(Management Catalog)下,如图:
二,示例1,规范存储过程(Stored Procedure)的命名
强制存储过程的命名必须以"usp_"开头, 命名规范是: sp_name like 'usp[_]%'。
Step1,选择对应的Facet,查看属性
由于我们针对的目标对象是存储过程(Stored Procedure),所以需要从Facets列表中选中Stored Procedure:
查看其属性,在Properties列表中有Name属性,表示存储过程的名字(Object Name)。
step2,创建条件(Condition)
条件(Condition)是一个逻辑表达式,可以使用SQL Server 支持的任何操作符来编写逻辑表达式,以规定存储过程的命名。
1,右击Facet,弹出快捷菜单,点击新建条件(New Condition),打开新建条件向导(Create new condition wizard)。
2,填写Facet的name属性,命名为SP_NameCondition。
Facet是Stored Procedure,Facet 属性直接决定了表达式面板(Expression Grid)的字段(Filed)列表的Items。从Field列表中选择@Name。
3,编辑字段
点击Field后面的省略号(...),弹出高级编辑器(Advanced Editor),在编辑器中编写TSQL代码对@Name进行编辑,如果允许“USP_”、“Usp_”等开头的存储过程命名,那么可以将Cell Value改写为“Lower(@Name)”。
在属性和函数面板(Properties and functions)中列出对字段进行编辑的函数或属性,在右侧的详细面板(Details)中,SQL Server简单描述函数的Properties和使用示例:
4,操作符(Operator)
在操作符列表中选择LIKE,值(Value)中填写'usp[_]%',点击Value后面的省略号“...”,能够弹出高级编辑器(Advanced Editor),对Value值进行编辑。
step3,创建策略
1,输入策略命名
本例将策略命名为“SP_NamePolicy”,在检查条件(Check Condition)列表中选择step2中创建的条件"SP_NameCondition"
2,目标(Against Targets)
我们针对的不是所有的SP,而是用户自定义的SP,点击 Stored Procedure 前面的下三角,不使用Every,而选择新建条件(new condition)。
我们针对的是特定数据库(db_study)中的所有用户自定义存储过程(User Defined Stored procedure),再创建一个Facet 为Database的Condition。
3,评估模式(Evaluation Mode)
评估模式共有四种,本例选择On change:prevent,并勾选 Enable复选框。
点击OK,弹出错误消息,不支持Evaluation Mode “On Change:Prevent”,Object Set 是指Stored Procedures的集合,将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,命令执行成功。
三,示例2: 强制Table 或Index 必须使用数据压缩策略(Data Compression Policy)
从示例1中,我们可以看出,选择相应的Facet非常重要。在table facet列表中,系统自动创建了HasCompressedPartitions和RowCount属性,属性HasCompressedPartitions表示Table 或 index是否压缩,RowCount属性返回table的数据行数。
step1,创建条件
当表的数据行数大于1000000,必须进行数据压缩。当对策略进行评估时,如果 @RowCount>1000000 and @HasCompressedPartitions=true,那么符合策略;如果 @RowCount>1000000 and @HasCompressedPartitions=true 不满足,即@RowCount<=1000000 or @HasCompressedPartitions=false,那么违反策略。所以,检查条件(Check Condition)的表达式是 @RowCount<=1000000 or @HasCompressedPartitions=false。
step2,创建策略
评估模式选择 On Demand。
Step3,查看策略管理
step4,评估策略
查看策略评估(Policy Evaluation)的结果,DB中的所有tables 满足检查条件(Check condition):
四,对单个对象进行策略评估
1,选择一个Table,右击弹出快捷菜单,有Policies 和facets 子菜单,点击评估(Evaluate)
2,选择Policy,对单个table进行评估
3,查看评估结果
推荐文档: