2014-04-01 3 views
0

테이블로 병합하는 저장 프로 시저가 있습니다. someSchema.UpsertSomeStuff이라고합시다 (dbo 스키마에 없음). dbo.SomeStuff 테이블을 호출합니다 (이 테이블은 dbo 스키마에 있음).저장 프로 시저에 사용 권한 부여

데이터 판독기/데이터 기록기 사용자와 함께 저장 프로 시저를 호출하면 올바르게 작동합니다.

그러나 매우 약한 사용자 (데이터 작성자 또는 판독기 권한 없음)에게이 저장 프로 시저를 호출 할 수있는 권한을 부여하면 dbo를 선택하거나 삽입하거나 업데이트 할 수 없다는 메시지가 표시되지 않습니다. SomeStuff.

약한 사용자에게 해당 테이블에 대한 액세스 권한을 부여하고 싶지 않습니다. 저장 프로 시저에 액세스 권한을 부여하기 만하면됩니다. 그가 저장 프로 시저를 수정하려고 할 때

나는 WITH EXECUTE AS OWNER를 사용하여 시도하고 작동하는 듯하지만 내 동료는이 오류를 받기 시작 :

, 사용자의 MyUserNameHere '로 실행할 수 없습니다 그것 때문에 존재하지 않거나 권한이 없습니다.

소유자와 스키마의 차이점에 대해 다소 혼란 스럽습니다. 하지만 내 개인 사용자 계정에 연결하지 않고이 작업을 수행 할 수있는 방법이 있어야한다고 생각합니다.

+0

보세요 ['here'] (http://stackoverflow.com/questions/19517251/sql-server-user-permissions-on-stored-procedure-and-underlying-tables) –

+0

OP가 분명했습니다. 이 사용자에게 테이블에 대한 액세스 권한을 부여하고 싶지 않습니다. – dean

답변

0

필요한 것은 절차에 서명하는 것입니다.

날 자신의 의견 ( SQL Server User Permissions on Stored Procedure and Underlying Tables)에서 제공하는 링크 M.Ali에서 설정을 빌려 보자
use Test 
go 
if exists (select * from sys.syslogins where name = 'UserA') 
    drop login UserA 
create login UserA with password = 'Welcome' 
if exists (select * from sys.syslogins where name = 'UserB') 
    drop login UserB 
create login UserB with password = 'Welcome' 
if exists (select * from sys.syslogins where name = 'UserC') 
    drop login UserC 
create login UserC with password = 'Welcome' 


if exists (select * from sys.tables where name = 'Customers' and schema_name(schema_id) = 'SchemaA') 
    drop table SchemaA.Customers 
if exists (select * from sys.schemas where name = 'SchemaA') 
    drop schema SchemaA 
if exists (select * from sys.sysusers where name = 'UserA') 
    drop user UserA 

if exists (select * from sys.tables where name = 'Orders' and schema_name(schema_id) = 'SchemaB') 
    drop table SchemaB.Orders 
if exists (select * from sys.procedures where name = 'GetCustomerOrderInfo' and schema_name(schema_id) = 'SchemaB') 
    drop procedure SchemaB.GetCustomerOrderInfo 
if exists (select * from sys.schemas where name = 'SchemaB') 
    drop schema SchemaB 
if exists (select * from sys.sysusers where name = 'UserB') 
    drop user UserB 

if exists (select * from sys.sysusers where name = 'UserC') 
    drop user UserC 

create user UserA for login UserA 
alter role db_owner add member UserA 
go 
create schema SchemaA authorization UserA 
go 
create user UserB for login UserB 
alter role db_owner add member UserB 
go 
create schema SchemaB authorization UserB 
go 
create user UserC for login UserC 

create table SchemaA.Customers (id int identity) 

create table SchemaB.Orders (id int identity, CustomerId int) 
go 
create procedure SchemaB.GetCustomerOrderInfo 
as 
select * 
from SchemaB.Orders o 
join SchemaA.Customers c 
on  c.id = o.CustomerId 
go 

는 설치, Andomar을 들으했다.

우리는 UserC에게이 프로 시저에 대한 실행 권한을 부여 할 수 있습니다 :

grant execute on SchemaB.GetCustomerOrderInfo to UserC 
execute as login = 'UserC' 
exec SchemaB.GetCustomerOrderInfo 
-- The SELECT permission was denied on the object 'Customers', database 'Test', schema 'SchemaA'. 
revert 

이 충분하지 않았다. 그것은해야

create certificate cert_raiser 
    encryption by password = 'pGFD4bb925DGvbd2439587y' 
    with subject = 'raiser', 
    expiry_date = '01/01/2114'; 
go 

create user cert_user from certificate cert_raiser 
go 

alter role db_owner add member cert_user 
go 

add signature to SchemaB.GetCustomerOrderInfo 
    by certificate cert_raiser 
    with password = 'pGFD4bb925DGvbd2439587y'; 
go 

을 : 우리가 할 수있는 일은 인증서와 절차에 서명 한 후,이 인증서에 대한 데이터베이스 사용자가 해당 사용자 적절한 권한을 (이 샘플에서 db_owner 역할)을 얻었다 데이터베이스에 인증서를 만들고있다 이제 OK.

주의 사항 : 인증서에 생성 된 사용자는 일반 사용자로 사용할 수 없으며 로그인도없고 보안 문제가 아닙니다. 우리가 서명을 추가 할 때 프로 시저가 실행되는 컨텍스트에 우리가 그 사용자에게주는 모든 사용 권한이 추가됩니다. 절차를 변경하면 다시 서명해야합니다.