jerrynet

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

SQLServer2008策略审核存储过程书写规范

作者:Jerrynet

背景

关于SQLServer2008的策略管理,网上大部分的文章都是以存储过程的命名规范为例:强制要求存储过程的名字以特定的字符串开头,如usp_等等。文章都写得挺好的,图文并茂介绍得很详细。

我在想是否也可以把策略的管理延伸到存储过程内容的书写规范呢?

答案是肯定的。接下来就为大家介绍下主要的过程和一些注意事项。

主要思路

在日常的数据库维护中,经常会出现这样的情况:找到了某个存储过程有性能问题需要改,无奈却找不到写的人(我们公司的存储过程都是程序员自己搞定的);自己改吧,改好了又没法充分验证功能绝对问题。

基于上面的情况,我们规定了每个存储过程都要标明作者和功能说明。格式类似于:

-- 作者: Jerrynet

-- 说明: 修改××表中对应××的信息,在××地方调用

简单就是美!我们只要看下存储过程的定义文本中是否有“作者”、“说明”这几个词就可以了。

关键步骤

目标确定了,我们看下如何实现。

首先我们要操作的对象是存储过程,于是我们在【管理】->【策略管理】->【方面】->【存储过程】,单击右键选择新建条件如下图:

 

 

点击弹出 如下的“创建新条件”对话框:

 

 

 

在打开的条件窗口中输入名称,在“表达式”中的字段栏中,没有直接的一个属性是表示存储过程的定义文本的,只有一些像过程名称、过程所有者、是否加密等属性。

那有没有替代的办法得到存储过程的定义文本的?答案就是ExecuteSQL()

先看下官方对于该函数的简单介绍:

函数签名:Variant ExecuteSQL (String returnType, String sqlQuery)

函数说明:对目标服务器执行 Transact-SQL 查询。

参数: returnType - 指定 Transact-SQL 语句返回的数据类型。

sqlQuery - 包含要执行的查询的字符串。

示例: ExecuteSQL ('Numeric', 'SELECT COUNT(*) FROM msdb.dbo.sysjobs') <> 0

有了变通的方法,剩下的任务就是获取某个过程的定义文本了。主要的语句如下,如果能找到符合条件的语句,就显示OK,否则就返回空结果集。

 

SELECT 'OK'

FROM INFORMATION_SCHEMA.ROUTINES

WHERE (ROUTINE_DEFINITION LIKE '%作者%' or ROUTINE_DEFINITION LIKE '%Author%')

       AND

      (ROUTINE_DEFINITION LIKE '%说明%' or ROUTINE_DEFINITION LIKE '%Description%')

       AND

       ROUTINE_TYPE='PROCEDURE' AND ROUTINE_NAME=@@ObjectName

 

如果结果集为空就表示存储过程没有满足我们的要求,就输出Error,用IsNull即可。点击上图的红框出,在“高级编辑”窗口输入代码。最终的高级编辑中的效果,如下图

 

 

值得注意的是,这里的过程名不能用属性@Name,而是用@@ObjectName

 

手工评估一下测试数据库,如果没有添加必要注释的存储过程就会出现错误提示。点击详细信息中的查看,还可以看到实际值和预期值不符。详见下图所示:

 

注意事项

1.       存储过程名用变量@@ObjectName来替换

2.       ExecuteSQL函数的sqlQuery参数,原来用到单引号的地方,用两个单引号来转义

3.       ExecuteSql 不支持OnChange模式,也就无法禁止或者实时记录违规操作,不免有些遗憾

4.       如果评估模式选“按计划”时,会出现如下的错误信息:

System.Data.SqlClient.SqlException: 服务器主体 "##MS_PolicyTsqlExecutionLogin##" 无法在当前安全上下文下访问数据库 "DB_Test"

 

         原因就是登录名"##MS_PolicyTsqlExecutionLogin##"的权限不够,执行下面这段代码授权即可。

 

USE [DB_Test]

GO

CREATE USER [##MS_PolicyTsqlExecutionLogin##] FOR LOGIN [##MS_PolicyTsqlExecutionLogin##]

GO

ALTER USER [##MS_PolicyTsqlExecutionLogin##] WITH DEFAULT_SCHEMA=[dbo]

GO

EXEC sp_addrolemember N'db_accessadmin', N'##MS_PolicyTsqlExecutionLogin##'

GO

        

         在策略管理方面,SQLServer没有提供给我们所有可能用得到的属性,而是给我们可以发挥更大空间的函数。

给了我们一箩鱼的同时,又给了我们捕鱼的鱼具,这就是SQLServer策略管理!

 

 

 

         【出自blog.csdn.net/jerrynet,转载请注明作者出处】

posted on 2009-10-12 23:01  Jerrynet  阅读(988)  评论(0)    收藏  举报