Berikan izin eksekusi untuk pengguna pada semua prosedur yang disimpan dalam database?

104

Saya membuat skrip dari database lama, membuat database baru dan mengimpor semua data dari database lama. Sejauh ini bagus, bagaimanapun, tidak ada pengguna yang memiliki hak untuk menjalankan prosedur yang tersimpan. Saya tahu saya bisa menggunakan

GRANT EXECUTE ON [storedProcName] TO [userName] 

Jika itu hanya beberapa prosedur, bagaimanapun, saya memiliki sekitar 100 jadi apa cara termudah bagi saya untuk memberikan akses eksekusi untuk pengguna tertentu ke semuanya?

Terima kasih sebelumnya.

Nick
sumber

Jawaban:

115

Buat peran, tambahkan peran ini ke pengguna, dan kemudian Anda dapat memberikan eksekusi ke semua rutinitas dalam satu kesempatan untuk peran ini.

CREATE ROLE <abc>
GRANT EXECUTE TO <abc>

EDIT
Ini berfungsi di SQL Server 2005, saya tidak yakin tentang kompatibilitas ke belakang dari fitur ini, saya yakin apa pun yang lebih dari tahun 2005 akan baik-baik saja.

Sanjeevakumar Hiremath
sumber
Saya baru saja mencoba ini di SQL Server 2008 Standard (amazon RDS) dan berfungsi dengan sangat baik.
datagod
bisakah Anda memberikan contoh? katakanlah saya perlu memberikan izin EXECUTE pada semua SP untuk pengguna SPExecuter
Uri Abramson
4
satu-satunya pernyataan lain yang diperlukan adalah baris yang menambahkan pengguna ke peran tersebut, seperti: ALTER ROLE [abc] TAMBAHKAN ANGGOTA [user_name]
dhochee
GRANT EXEC TO public
Simon Hughes
27
Anda sebenarnya tidak perlu membuat peran, Anda dapat menerapkannya langsung ke pengguna, misalnya GRANT EXECUTE TO userName. Saya kira ini cukup untuk pertanyaan OP.
Chris Peacock
25

Tanpa memperumit masalah, untuk memberikan EXECUTE pada database yang dipilih:

USE [DB]
GRANT EXEC TO [User_Name];
Bartosz X
sumber
1
bekerja untuk saya, dan mungkin mencakup semua procs tersimpan di masa mendatang (kita akan mencari tahu), daripada skrip yang memberi nama setiap proc yang disimpan.
Ken Forslund
19

Ini adalah solusi yang berarti bahwa saat Anda menambahkan prosedur tersimpan baru ke skema, pengguna dapat menjalankannya tanpa harus memanggil eksekusi hibah pada prosedur tersimpan yang baru:

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

Referensi: Berikan Izin Eksekusi pada Semua Prosedur Tersimpan

Colin
sumber
6

gunakan kode di bawah ini, ubah nama database dan nama pengguna yang benar dan kemudian ambil output itu dan jalankan di SSMS. UNTUK SQL 2005 DI ATAS

USE <database_name> 
select 'GRANT EXECUTE ON ['+name+'] TO [userName]  '  
from sys.objects  
where type ='P' 
and is_ms_shipped = 0  
Hemanshu Trivedi
sumber
1
Anda juga perlu memasukkan tipe 'PC' untuk memasukkan prosedur tersimpan CLR.
Oleh Nechytailo
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
GCH
sumber