데이터베이스에 저장된 여러 프로 시저가 별도의 데이터베이스에있는 데이터 마트에서로드하는 데 사용됩니다. 이러한 절차는 일반적으로 다음과 같은 형식으로 이루어집니다.저장 프로 시저 소유권 체인
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을 설정하는 것이 었습니다. 따라서 전체 데이터베이스 소유권 체인에 의존하지 않고 두 데이터베이스간에 제한된 소유권 체인을 허용합니다.
을 사용자가 실제로 DBO (db_owner는 사용자가 생각하고있는 역할입니다. –