2011-09-07 42 views
1

我有一個存儲過程,在我的SQL Server,這一次設置權限給所有的存儲過程爲particulat數據庫中的一個數據庫。有沒有一種方法來創建的方式這個存儲過程中,我可以輕鬆地從任何數據庫的SQL服務器中,如果讓我怎麼去這樣做這樣的事情可以創建使用SQL存儲過程的所有數據庫

+0

不是我所知 - 至少在我所知道的任何數據庫系統中都沒有。存儲過程始終是單個數據庫的一部分 - 對於這些存儲過程沒有「全局」範圍... –

回答

0

我有我的SQL服務器中的存儲過程,在一個數據庫中,該 權限集在一次所有存儲過程的特定 數據庫。

你可以歸檔相同的結果要容易得多:

  • 創建新的角色,例如db_executor

    CREATE ROLE db_executor 
    
  • 授予該角色的執行權限,不指定任何對象:

    GRANT EXECUTE TO db_executor 
    

這個角色,現在對所有存儲過程和函數執行權限 - 它甚至會得到爲相同權限的任何未來的存儲過程您添加到您的數據庫!

只需將此角色分配到您需要的用戶,你就大功告成了....

+0

Marc,這是有道理的。我想知道我在哪裏創建角色,服務器(特定數據庫或其他地方)中的哪個級別,以及何時將角色分配給角色,我找不到角色。 – mattgcon

+0

我最初問這個問題的原因是因爲我不斷從我的客戶端在我的系統上安裝新的數據庫,並且我只使用一個通用連接字符串,其用戶名和密碼與我的PC上的默認用戶名和密碼相同。 – mattgcon

0

你試過3或4部分名字來稱呼它?

InstanceName.DatabaseName.dbo.usp_Name

反過來可能在其他數據庫參考對象使用相同的約定這一程序。因此,您可以參數化要操作的數據庫的名稱,並使用動態SQL生成4個部分名稱來引用對象,如系統表。

0

雖然以授予執行所有程序的這一特定問題的最佳解決方案是the one provided by 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

相關問題