2008-09-29 2 views
2

데이터베이스에 저장된 여러 프로 시저가 별도의 데이터베이스에있는 데이터 마트에서로드하는 데 사용됩니다. 이러한 절차는 일반적으로 다음과 같은 형식으로 이루어집니다.저장 프로 시저 소유권 체인


CREATE PROCEDURE load_stuff 
WITH EXECUTE AS OWNER AS 
INSERT INTO my_db.dbo.report_table 
(
    column_a 
) 
SELECT 
    column_b 
FROM data_mart.dbo.source_table 
WHERE 
    foo = 'bar'; 

SQL Server Management Studio에서 쿼리를 실행하면 정상적으로 실행됩니다. EXEC load_stuff를 사용하여 실행하려고하면 보안 경고와 함께 프로 시저가 실패합니다.

서버 보안 주체 "the_user"가 현재 보안 컨텍스트에서 "data_mart"데이터베이스에 액세스 할 수 없습니다.

sproc의 소유자는 dbo입니다.이 예는 the_user입니다 (이 예의 경우). 두 데이터베이스의 OWNER도 the_user이며 the_user는 dbo (SQL Server가 수행해야하는 작업)에 매핑됩니다.

왜 SQL Server에서이 오류가 발생합니까? 문제의 사용자가 dbo로 별칭을 지정하고 데이터베이스 간 데이터 액세스에 다른 사용자 계정을 사용해야하기 때문입니까?

편집 SQL Server는 기본적으로 데이터베이스 간 소유권 체인을 해제하므로 유용합니다. 그러나, 나는이 상황에서 모범 사례가 확실하지 않다. 이 시나리오의 모범 사례에 대한 의견이있는 사람이라면 크게 환영 할 것입니다.

편집 2 결국 해결 방법은 두 데이터베이스 모두에서 TRUSTWORTHY ON을 설정하는 것이 었습니다. 따라서 전체 데이터베이스 소유권 체인에 의존하지 않고 두 데이터베이스간에 제한된 소유권 체인을 허용합니다.

답변

2

EXECUTE AS OWNER를 삭제하지 않는 이유는 무엇입니까?

일반적으로 내 사용자가 SP를 실행하면 두 데이터베이스에서 모두 적절한 권한을 가지게되므로 전혀 수행 할 필요가 없습니다.

0

실제로 DBO는 자신의 사용자가 아닌 역할 (사용자 그룹으로 간주 할 수 있음)입니다. (dbo : passwordfordbo를 사용하여 SQL SERVER에 연결할 수있는 경우가 아니면 사용자가 아닙니다.)

대개 Sql Server의 멋진 세계에서 storedprocY를 실행하기 위해 userX 권한을 부여한 다음 X는 Y에 포함 된 모든 개체에 대한 모든 권한을 가지고 있지 않더라도 Y가 포함하는 모든 작업을 수행 할 수있는 권한을 얻습니다. 저장 프로 시저에서 비즈니스 로직을 캡슐화 할 수있는 매우 유용한 기능입니다 Y.

. (사용자는 테이블에 액세스 할 수 없지만 저장된 proc를 실행할 수 있습니다.)

우리가 "소유권 체인"에 관해 이야기 할 때 그것은 다음을 의미합니다. (내가 잘못하면 나를 교정하십시오) - 소유권 체인이 비활성화 된 경우 : 필요한 모든 객체가있는 한 procedureX를 실행할 수있는 권한이 작동합니다 동일한 데이터베이스 - 체인 연결이 가능합니다 : "권한"이 모든 데이터베이스를 향해 확장됩니다.

하는 데 도움이

희망,

+0

을 사용자가 실제로 DBO (db_owner는 사용자가 생각하고있는 역할입니다. –

1

로그인을 만들 필요가 없습니다, 당신은 목표 DB에서 게스트 사용자를 활성화 할 수 있습니다.게스트

보조금 연결

이 게스트 컨텍스트에서 DB를 입력하도록 사용자를 실행 수 있으며, DB 체인 액세스 ON 상태 "대상 DB에 검사하지 않습니다.