用SQLServer2008策略审核存储过程书写规范
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
众所周知SQL2008的策略可以审核存储过程的命名规范,那存储过程内容的规范呢?…
用SQLServer2008策略审核存储过程书写规范
作者:Jerrynet 背景
关于SQLServer2008的策略管理,网上大部分的文章都是以存储过程的命名规范为例:强制要求存储过程的名字以特定的字符串开头,如usp_等等。文章都写得挺好的,图文并茂介绍得很详细。
我在想是否也可以把策略的管理延伸到存储过程内容的书写规范呢?
答案是肯定的。接下来就为大家介绍下主要的过程和一些注意事项。
主要思路
在日常的数据库维护中,经常会出现这样的情况:找到了某个存储过程有性能问题需要改,无奈却找不到写的人(我们公司的存储过程都是程序员自己搞定的);自己改吧,改好了又没法充分验证功能绝对问题。
基于上面的情况,我们规定了每个存储过程都要标明作者和功能说明。格式类似于:
-- 作者: Jerrynet
-- 说明:修改××表中对应××的信息,在××地方调用
简单就是美!我们只要看下存储过程的定义文本中是否有“作者”、“说明”这几个词就可以了。
关键步骤
目标确定了,我们看下如何实现。
首先我们要操作的对象是存储过程,于是我们在【管理】->【策略管理】->【方面】->【存储过程】,单击右键选择”新建条件”如下图:
点击弹出如下的“创建新条件”对话框:
在打开的条件窗口中输入名称,在“表达式”中的字段栏中,没有直接的一个属性是表示存储过程的定义文本的,只有一些像过程名称、过程所有者、是否加密等属性。
那有没有替代的办法得到存储过程的定义文本的?答案就是ExecuteSQL()!
先看下官方对于该函数的简单介绍:
函数签名:Variant ExecuteSQL (String returnType, String sqlQuery)
函数说明:对目标服务器执行 Transact-SQL 查询。
参数:r eturnType - 指定 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策略管理!
【出自/jerrynet,转载请注明作者出处】