[英]Possible to create a SQL stored procedure for use for all databases
我在SQL Server的一個數據庫中有一個存儲過程,該存儲過程可以立即為該特定數據庫設置所有存儲過程的權限。 有沒有一種方法可以創建此存儲過程?我可以從SQL Server中的任何數據庫輕松地調用它,如果可以的話,該如何做呢?
盡管對所有過程都授予執行權這一特定問題的最佳解決方案是marc_s提供的解決方案,但實際的問題是有一種方法可以創建一個存儲過程並使之可用於所有數據庫。
在https://nickstips.wordpress.com/2010/10/18/sql-making-a-stored-procedure-available-to-all-databases/中記錄了執行此操作的方法:
master
數據庫中創建存儲過程。 sp_
,例如sp_MyCustomProcedure
sys.sp_MS_marksystemobject
傳遞過程中,如名EXEC sys.sp_MS_marksystemobject sp_MyCustomProcedure
這是一個簡單的示例,僅選擇當前數據庫的名稱:
use master
go
create procedure dbo.sp_SelectCurrentDatabaseName as begin
select db_name()
end
go
execute sys.sp_MS_marksystemobject sp_SelectCurrentDatabaseName
go
然后,在任何數據庫上調用exec dbo.sp_SelectCurrentDatabaseName
都將起作用。
要將過程標記為不是系統對象,建議在https://social.msdn.microsoft.com/Forums/sqlserver/en-US/793d0add-6fd9-43ea-88aa-c0b3b89b8d70/how-do中找到一些討厭的技巧-i-undo-spmsmarksystemobject?forum = sqltools,但是僅刪除並重新創建該過程是最安全和最容易的。
警告
當然,創建這樣的系統過程將打破不將自己的過程命名為sp_xxx
的通用規則,因為它們可能與SQL Server的未來版本中的內置過程發生沖突。 因此,應該謹慎進行此操作,而不僅僅是創建大量有用的隨機命名過程。
避免這種情況的一種常見的簡單方法是將自己的公司/個人前綴添加到Microsoft不太可能使用的過程中,例如sp_MyCompany_MyCustomProcedure
。
您嘗試過3或4零件名稱嗎?
InstanceName.DatabaseName.dbo.usp_Name
該過程又可以使用相同的約定引用其他數據庫中的對象。 因此,您可以參數化要操作的數據庫的名稱,並使用動態SQL生成4個部件名稱以引用諸如系統表之類的對象。
我在SQL Server的一個數據庫中有一個存儲過程,該存儲過程可立即為該特定數據庫設置對所有存儲過程的權限。
您可以更輕松地歸檔相同的結果:
創建一個新角色,例如db_executor
CREATE ROLE db_executor
授予該角色執行權限,而無需指定任何對象:
GRANT EXECUTE TO db_executor
現在,該角色對所有存儲過程和功能都具有執行權限-甚至對於您添加到數據庫中的任何未來存儲過程 ,它都將獲得相同的權限!
只要將此角色分配給您需要的用戶,就可以完成...。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.