2009-11-02 2 views
1

2 개의 스키마가 있으며 첫 번째 스키마의 개체 중 하나는 다른 스키마의 개체에 액세스해야합니다. 예 :다른 스키마에 액세스하는 개체가있는 스키마에 대한 사용 권한을 설정하는 방법은 무엇입니까?

CREATE VIEW I.ITest 
AS 
    SELECT 1 as TestColumn 
GO 
CREATE VIEW O.OTest 
AS 
    SELECT * FROM I.ITest 
GO 

EXEC ('SELECT * FROM O.OTest') AS USER = 'TestUser' 

DROP VIEW O.OTest 
DROP VIEW I.ITest 

위의 예에서 TestUser는 'O'스키마에만 액세스 할 수 있습니다. 그래서 스스로 선택은 잘 작동하지만보기가 다른 스키마 '나'다음에서 선택을하고 있기 때문에 오류와 함께 실패합니다

The SELECT permission was denied on the object 'ITest', database 'MyDB', schema 'I'.

이 해결하기 위해 내가 액세스에 'O'스키마 권한을 부여 할 수 있습니다 'I'스키마가 있지만 올바르게 작동하지 않으며 스키마 권한을 건너 뜁니다.

수행 할 수있는 작업은 무엇입니까? 이 모든 일을 잘못하고 있니? 이 시나리오에서 가장 좋은 방법은 무엇입니까?

감사

UPDATE : 내 스키마가 서로 다른 DB의 역할에 의해 소유되었다 그래서 단순히 DBO에 모두의 소유자를 변경 한 후 스키마에 액세스 할 수있는 DB 역할 권한을 부여하여이 문제를 해결 얻었다. 이것은 소유자 dbo가 모든 것을 볼 수 있었고이 스키마를 통해서만 db 역할에만 특정 권한을 부여 할 수 있었고 나머지 db 개체는 사용할 수 없다는 것을 의미했습니다. 귀하의 도움에 감사드립니다

+0

사용자 작성 명령문과 각 사용자가 속한 기본 스키마를 제공 할 수 있습니까? –

+0

비아 관리 스튜디오에서 사용자를 만들었습니다. 즉, 스크립트를 통해서가 아닌 것이 중요합니까? – HAdes

답변

1

저장 프로 시저 내에서 "다른"스키마의보기에서 데이터 선택을 래핑해야합니다. 그런 다음 저장 프로 시저에 대한 실행 권한을 부여합니다. 사용자가보기에 직접 액세스 할 수는 없지만 저장 프로 시저를 통해 액세스가 허용됩니다. 여기

는 작품으로 보안 원칙을 설명하기위한 예시적인 연습입니다 :

USE DATABASE SANDBOX; 

--Create Logins 
CREATE LOGIN UserOne WITH Password='Hello123'; 
CREATE LOGIN UserTwo WITH Password='Hello123'; 

--Create Database Users 
CREATE USER UserOne; 
CREATE USER UserTwo; 

--Create the Test Schemas 
CREATE SCHEMA SchemaOne AUTHORIZATION UserOne; 
CREATE SCHEMA SchemaTwo AUTHORIZATION UserTwo; 

--Create a View on SchemaOne 
CREATE VIEW SchemaOne.ViewOne 
AS SELECT 1 as TestColumn; 

--Create a View on SchemaTwo 
CREATE VIEW SchemaTwo.ViewTwo 
AS SELECT * FROM SchemaOne.ViewOne; 

--Test that the SchemaOne 
EXEC('select * from SchemaOne.ViewOne') AS USER = 'UserOne' 
--1 

EXEC('select * from SchemaTwo.ViewTwo') AS USER = 'UserOne' 
--The SELECT permission was denied on the object 'ViewTwo', database 'SANDBOX', schema 'SchemaTwo'. 

--Create a stored procedure to safely expose the view within SchemaTwo to UserOne who's default Schema is 
--SchemaOne. 
CREATE PROCEDURE SchemaTwo.proc_SelectViewTwo 
AS 
    select * from SchemaTwo.ViewTwo; 

--Grant execute rights on the procedure 
GRANT EXECUTE ON SchemaTwo.proc_SelectViewTwo TO UserOne; 

--Test the 
EXECUTE AS LOGIN='UserOne'; 
    Exec SchemaTwo.proc_SelectViewTwo; 
revert; 

여러 스키마에 대한 액세스를 제어하기 위해 데이터베이스 역할을 사용하는 것입니다 내 의견에 suggeted으로 다른 방법. 위의 솔루션에 정의 된대로 당신과 같이 데이터베이스 역할을 사용할 수, 교장 사용 :

EXEC sp_addrole 'CrossSchemaRole'; 
EXEC sp_addrolemember 'CrossSchemaRole','UserOne'; 

GRANT SELECT ON SCHEMA::SchemaOne TO CrossSchemaRole; 
GRANT SELECT ON SCHEMA::SchemaTwo TO CrossSchemaRole; 

EXECUTE AS LOGIN='UserOne'; 
    select * from SchemaTwo.ViewTwo; 
revert; 

일부 제안 추가 읽기 :

+0

그러나 답장을 보내 주셔서 감사합니다. 그러나 이것은 기본적으로 스키마 권한 부여를 우회하는 것이지만 길어지는 방법입니다. 뷰에 대한 래퍼로 sp를 만드는 대신 사용자에게 '다른'스키마의 뷰에 직접 액세스 할 수 있습니다.이 모든 것이 스키마의 사용을 우회하고 있습니다. 이것은 내가하고 싶지 않은 것입니다. 어쩌면 대답은 "당신은 하나의 스키마를 다른 사람에게 접근해서는 안됩니다."하지만 이것이 맞는지 나는 잘 모르겠습니다. – HAdes

+0

특정 데이터베이스 사용자에게 여러 스키마 및 스키마 개체에 대한 액세스 권한을 부여하려면 데이터베이스 역할을 사용하여 관리해야합니다. –

+0

네, 지금 해본 적이 있지만 아직 스키마 권한을 우회하고 있습니다. 즉, 이제는이 시나리오 때문에 3 개의 스키마에 액세스하는 db 역할의 사용자가 생겼습니다. 이제는 다른 스키마의 모든 것에 액세스 할 수 있거나 '다른'스키마의 개체 사용 권한으로 개체를 수동으로 설정해야하기 때문에 위험한 것으로 들립니다. 내가 정말로 원하는 것은, 사용자 A에게 객체 B에 대한 액세스 권한을 부여하면 객체 B가 수행하는 작업 (즉, 다른 스키마 객체에 삽입)에 관계없이 그 작업이 수행되어야한다는 것입니다. – HAdes

1

분명히 permissio ns는 사용자가 아니라 객체입니다. 귀하 또는 다른 스키마 소유자가 다른 사용자가 오브젝트에 액세스 할 수있게하려는 경우 (테이블, 뷰 또는 무엇이든간에) 다른 스키마의 소유자가됩니다. 개발자라면 다른 스키마의 객체에 액세스하는 프로 시저를 작성할 수 있기 때문에 프로 시저를 실행하는 사람도 그렇게 할 수 있어야합니다. 역할은 갈 길입니다.

+0

내 개발자의 무지와 관련된 좋은 지적. 그렇게 그렇게되면 나는 운이 좋은 모든 스키마에 액세스 할 수 있습니다. 따라서 기본적으로 '다른'스키마에 대한 개체 액세스로 개체를 지정하거나 db 역할을 통해 액세스 권한을 부여하는 것입니다. 개체에 대한 액세스 권한을 부여했기 때문에 액세스가 암시 적으로 개체 내에서 해결되지 않은 이유를 이해할 수 없습니다. – HAdes