日期:2014-05-16  浏览次数:20454 次

第十八章——基于策略的管理(2)——限制数据库对象

前言:

在实际环境中,会有很多开发人员正在对一个项目编写SQL脚本,此时需要对对象的命名经行强制限定。完成这个任务可以使用强制的一些策略来实现。

合理的命名对象并不仅仅是处于维护需要,有时候也能影响性能,限定数据库的命名对象将能避免一些性能问题。通常SP_是用于SQLServer系统存储过程,但是一些程序员会尝试将其作为自定义存储过程的命名。

下面我们将演示如何使用策略,来限定SP_前缀,让其只属于SQLServer系统存储过程的命名规则。

 

准备工作:

需要有sysadmin角色的权限登录。

 

 

步骤:

1、  连到SQLServer,并右键【策略】,点击【新建策略】,如图:


2、  输入策略名:Stored Procedure Naming Convertion,并选择【新建条件】:


 

3、  输入Stored Procedure Naming作为名称,并在【方面】中选择【多部分名称】


然后输入图中的表达式:


4、  点击【确定】以后,在【评估模式】中选择【更改时:禁止】,然后点击启用。


5、  现在尝试创建自定义存储过程:


USE AdventureWorks
GO
CREATE PROC sp_SelectProc
AS
    SELECT  1
GO


6、  因为策略的影响,会看到如下的情况: 


这里有个小插曲,原著上并不提及,当我没有在第五步中添加use AdventureWorks的时候,直接执行会报错:

消息233,级别20,状态0,第0 行
在向服务器发送请求时发生传输级错误。(provider: 共享内存提供程序, error: 0 - 管道的另一端上无任何进程。)



7、  现在把存储过程名换成别的名字,将不会发生任何错误(当然如果存储过程名字已经存在或者有其他语法错误,还是会报错,但是于策略无关):百思不得其解,在网上搜了一下类似的错误,发现别人的代码少了一些GO之类的语句,然后我就尝试把代码完善,加上了use,结果就可以执行了,暂时未有官方解释,我也尝试禁用了策略后执行,也没错,所以我觉得编程规范在这里显示的特别重要,另外我也尝试了use语句注销掉,但是不删除,依然能够执行,估计SQLServer还是检测到了。


 

USE AdventureWorks
GO
CREATE PROC usp_SelectProc
AS 
    SELECT  1 
GO

 

1楼u0101798631小时前
HJNGJHGJHGJHGUHGDGFDGJHGJNGJHGDFSFD