簡體   English   中英

可以創建一個用於所有數據庫的SQL存儲過程

[英]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/中記錄了執行此操作的方法:

  1. master數據庫中創建存儲過程。
  2. 必須將其命名為以sp_ ,例如sp_MyCustomProcedure
  3. 執行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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM