我们知道,SQL Server 2005/2008的系统存储过程在正常情况下是无法直接修改的。
尽管本文是介绍怎样修改它的,但在这里,我还是建议大家尽量不要去修改它。(好像有点绕哈...)
OK,闲话少说,下面我举个实际案例讲解一下,如对于系统存储过程sp_Monitor,若要运行此存储过程,用户必须是 sysadmin 固定服务器角色的成员。
通过执行命令:sp_helptext 'sp_Monitor',我们可以看到,该过程中存在这样的语句:
- if (not (is_srvrolemember('sysadmin') = 1)) -- Make sure that it is the SA executing this.
- begin
- raiserror(15247,-1,-1)
- return(1)
- end
在这里,我想将该过程中的这些语句去掉,让它能被普通用户执行。下面是具体的修改步骤:
1、停止SQL Server服务
2、进入命令提示行模式。依次执行以下命令:
1) cd C:/Program Files/Microsoft SQL Server/MSSQL.1/MSSQL/Binn --注:这是SQL 2005的默认安装目录,如你改变了实际安装路径,请按实际修改
2) sqlservr -s MSSQLSERVER -m --注:启动SQL Server服务,-s 指定实例名称(这里的实例名称是MSSQLSERVER,可按实际修改), -m 指定以单用户管理模式启动
3、以数据库专用管理员(DAC)方式连接SSMS (此处可参见 SQL Server 数据库专用管理员DAC连接方式)
4、执行语句:USE mssqlsystemresource
这里,我友情说明一下,mssqlsystemresource是一个系统数据库,它存储了所有系统存储过程、视图和函数。但它对于所有用户来说,都是不可见的,也就是说,在SSMS、sys.databases等里面,你都看不到它,如果在非DAC连接下,执行上述语句,系统会报错。
5、执行语句:alter database mssqlsystemresource set read_write --将mssqlsystemresource置为可修改状态,mssqlsystemresource数据库默认是只读的。
6、sp_helptext 'sp_Monitor' --显示该存储过程的源代码,你可将sp_Monitor改成你实际要改的存储过程名。
7、拷贝步骤6的结果,将create proc改成alter proc,并按你的实际需求修改代码,这里,我将前述的"if (not (is_srvrolemember('sysadmin') = 1)) -- Make sure that it is the SA executing this......"等语句去掉。
8、执行修改后的语句。 --到这一步为止,系统存储过程sp_Monitor已经被我们改了。
9、alter database mssqlsystemresource set read_only --将mssqlsystemresource还原为只读状态
10、最后,停止SQL Server服务,并以正常方法重新启动SQL Server.
老实说,上面的方法显得较为繁琐,不得万不得已,我不推荐使用。(再强调一次)
其实,可以拷贝系统存储过程的源代码到一个新建的存储过程中,然后再对这个新建的存储过程进行修改,在使用的时候,直接调用这个新过程即可。同样可以达到目的,而且还没有任何副作用。