データベース内のすべてのストアドプロシージャに対する実行権限をユーザーに付与しますか?


104

古いデータベースからスクリプトを生成し、新しいデータベースを作成して、古いデータベースからすべてのデータをインポートしました。ただし、これまでのところ、ストアドプロシージャの実行権限を持っているユーザーはいません。私は使用できることを知っています

GRANT EXECUTE ON [storedProcName] TO [userName] 

しかし、それがいくつかの手順である場合、私は約100を持っているので、特定のユーザーにすべてのユーザーに実行アクセス権を付与する最も簡単な方法は何ですか?

前もって感謝します。

回答:


115

ロールを作成してこのロールをユーザーに追加すると、すべてのルーチンの実行を一度にこのロールに付与できます。

CREATE ROLE <abc>
GRANT EXECUTE TO <abc>

EDIT
これはSQL Server 2005で機能します。この機能の下位互換性についてはよくわかりません。2005年以降は問題ないはずです。


私はこれをSQL Server 2008 Standard(amazon RDS)で試したところ、魅力的に機能しました。
datagod 2013年

例を挙げていただけませんか?ユーザーSPExecuterのすべてのSPにEXECUTE権限を付与する必要があるとしましょう
Uri Abramson

4
他に必要な唯一のステートメントは、次のようにユーザーをロールに追加する行です:ALTER ROLE [abc] ADD MEMBER [user_name]
dhochee

EXECを一般公開
Simon Hughes

27
実際にはロールを作成する必要はありません。これをユーザーに直接適用できます(例:GRANT EXECUTE T​​O userName)。これはOPの質問には十分だと思います。
Chris Peacock

25

問題を過度に複雑にすることなく、選択したデータベースでEXECUTEを許可するには、次のようにします。

USE [DB]
GRANT EXEC TO [User_Name];

1
私のために働いており、おそらく、各ストアドプロシージャに名前を付けるスクリプトではなく、将来のすべてのストアドプロシージャ(後で説明します)をカバーしています。
Ken Forslund

19

これはソリューションです。つまり、スキーマに新しいストアドプロシージャを追加すると、ユーザーは新しいストアドプロシージャでgrant executeを呼び出さなくてもそれらを実行できます。

IF  EXISTS (SELECT * FROM sys.database_principals WHERE name = N'asp_net')
DROP USER asp_net
GO

IF  EXISTS (SELECT * FROM sys.database_principals 
WHERE name = N'db_execproc' AND type = 'R')
DROP ROLE [db_execproc]
GO

--Create a database role....
CREATE ROLE [db_execproc] AUTHORIZATION [dbo]
GO

--...with EXECUTE permission at the schema level...
GRANT EXECUTE ON SCHEMA::dbo TO db_execproc;
GO

--http://www.patrickkeisler.com/2012/10/grant-execute-permission-on-all-stored.html
--Any stored procedures that are created in the dbo schema can be 
--executed by users who are members of the db_execproc database role

--...add a user e.g. for the NETWORK SERVICE login that asp.net uses
CREATE USER asp_net 
FOR LOGIN [NT AUTHORITY\NETWORK SERVICE] 
WITH DEFAULT_SCHEMA=[dbo]
GO

--...and add them to the roles you need
EXEC sp_addrolemember N'db_execproc', 'asp_net';
EXEC sp_addrolemember N'db_datareader', 'asp_net';
EXEC sp_addrolemember N'db_datawriter', 'asp_net';
GO

参照:すべてのストアドプロシージャに実行アクセス許可を付与する


6

以下のコードを使用して、適切なデータベース名とユーザー名を変更し、その出力を取得してSSMSで実行します。上記のSQL 2005の場合

USE <database_name> 
select 'GRANT EXECUTE ON ['+name+'] TO [userName]  '  
from sys.objects  
where type ='P' 
and is_ms_shipped = 0  

1
CLRストアドプロシージャを含めるには、「PC」タイプも含める必要があります。
Oleh Nechytailo 16

1
USE [DATABASE]

DECLARE @USERNAME VARCHAR(500)

DECLARE @STRSQL NVARCHAR(MAX)

SET @USERNAME='[USERNAME] '
SET @STRSQL=''

select @STRSQL+=CHAR(13)+'GRANT EXECUTE ON ['+ s.name+'].['+obj.name+'] TO'+@USERNAME+';'
from
    sys.all_objects as obj
inner join
    sys.schemas s ON obj.schema_id = s.schema_id
where obj.type in ('P','V','FK')
AND s.NAME NOT IN ('SYS','INFORMATION_SCHEMA')


EXEC SP_EXECUTESQL @STRSQL
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.