我們知道,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.
老實說,上面的方法顯得較為繁瑣,不得萬不得已,我不推薦使用。(再強調一次)
其實,可以拷貝系統存儲過程的源代碼到一個新建的存儲過程中,然后再對這個新建的存儲過程進行修改,在使用的時候,直接調用這個新過程即可。同樣可以達到目的,而且還沒有任何副作用。