ให้สิทธิ์ดำเนินการสำหรับผู้ใช้ในโพรซีเดอร์ที่เก็บไว้ทั้งหมดในฐานข้อมูลหรือไม่


106

ฉันสร้างสคริปต์จากฐานข้อมูลเก่าสร้างฐานข้อมูลใหม่และนำเข้าข้อมูลทั้งหมดจากฐานข้อมูลเก่า อย่างไรก็ตามจนถึงตอนนี้ดีมากไม่มีผู้ใช้คนใดเรียกใช้สิทธิ์สำหรับโพรซีเดอร์ที่จัดเก็บไว้ ฉันรู้ว่าฉันสามารถใช้ได้

GRANT EXECUTE ON [storedProcName] TO [userName] 

อย่างไรก็ตามหากเป็นเพียงไม่กี่ขั้นตอนฉันมีประมาณ 100 ขั้นตอนดังนั้นวิธีใดที่ง่ายที่สุดสำหรับฉันในการให้สิทธิ์ดำเนินการเข้าถึงสำหรับผู้ใช้เฉพาะกับพวกเขาทั้งหมด?

ขอบคุณล่วงหน้า.

คำตอบ:


118

สร้างบทบาทเพิ่มบทบาทนี้ให้กับผู้ใช้จากนั้นคุณสามารถอนุญาตให้ดำเนินการกับกิจวัตรทั้งหมดได้ในครั้งเดียวสำหรับบทบาทนี้

CREATE ROLE <abc>
GRANT EXECUTE TO <abc>

แก้ไข
สิ่งนี้ใช้ได้ใน SQL Server 2005 ฉันไม่แน่ใจเกี่ยวกับความเข้ากันได้แบบย้อนหลังของฟีเจอร์นี้ฉันแน่ใจว่าอะไรก็ตามที่ช้ากว่าปี 2005 ควรจะใช้ได้


ฉันเพิ่งลองสิ่งนี้กับ SQL Server 2008 Standard (amazon RDS) และมันใช้งานได้ดี
datagod

คุณช่วยยกตัวอย่างได้ไหม สมมติว่าฉันต้องให้สิทธิ์ EXECUTE ใน SP ทั้งหมดสำหรับผู้ใช้ SPExecuter
Uri Abramson

4
คำสั่งอื่น ๆ ที่จำเป็นเท่านั้นคือบรรทัดที่เพิ่มผู้ใช้ในบทบาทเช่นนี้: ALTER ROLE [abc] ADD MEMBER [user_name]
dhochee

GRANT EXEC สู่สาธารณะ
Simon Hughes

28
คุณไม่จำเป็นต้องสร้างบทบาทคุณสามารถใช้สิ่งนี้โดยตรงกับผู้ใช้เช่น GRANT EXECUTE TO userName ฉันคิดว่านี่เพียงพอแล้วสำหรับคำถามของ OP
Chris Peacock

28

โดยไม่ทำให้ปัญหาซับซ้อนเกินไปเพื่อให้การดำเนินการกับฐานข้อมูลที่เลือก:

USE [DB]
GRANT EXEC TO [User_Name];

1
ใช้งานได้สำหรับฉันและน่าจะครอบคลุม procs ที่เก็บไว้ในอนาคตทั้งหมด (เราจะค้นพบ) แทนที่จะเป็นสคริปต์ที่ตั้งชื่อแต่ละ proc ที่จัดเก็บไว้
Ken Forslund

19

นี่คือโซลูชันที่หมายความว่าเมื่อคุณเพิ่มโพรซีเดอร์ที่จัดเก็บใหม่ลงในสคีมาผู้ใช้สามารถดำเนินการได้โดยไม่ต้องเรียกใช้การดำเนินการให้สิทธิ์ในโพรซีเดอร์ที่จัดเก็บใหม่:

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
คุณต้องรวมประเภท 'PC' ด้วยเพื่อรวมกระบวนงานที่จัดเก็บ 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.