최근에 EXECUTE AS LOGIN을 사용하여 특정 사람이 데이터베이스 중 하나에서 테이블 함수를 사용할 수 있는지 여부를 확인했습니다. 테스트 결과 그가 할 수는 있지만 실패를 반복해서보고했습니다.
그 사람은 로그인 'WEB'을 사용하여 데이터베이스에 연결하고 로그인 'WEB'과 관련된 해당 데이터베이스에 사용자 'WEB'이 있으므로 다음 스크립트를 시도했습니다.
-- part 1
EXECUTE AS USER = 'WEB'
GO
SELECT
USER_NAME() AS 'user_name'
,SUSER_NAME() AS 'suser_name'
,SUSER_SNAME() AS 'suser_sname'
,SYSTEM_USER AS 'system_user'
GO
REVERT
GO
과
-- part 2
EXECUTE AS LOGIN = 'WEB'
GO
SELECT
USER_NAME() AS 'user_name'
,SUSER_NAME() AS 'suser_name'
,SUSER_SNAME() AS 'suser_sname'
,SYSTEM_USER AS 'system_user'
GO
REVERT
GO
첫 번째 부분은 다음과 같은 결과로 좋았습니다.
웹 | 웹 | 웹 | 편물
그러나 두 번째 결과는 약간 혼란 스러웠습니다.
dbo | 웹 | 웹 | 편물
EXECUTE AS USER와 EXECUTE AS LOGIN의 차이점은 무엇입니까? 물론 첫 번째 것은 데이터베이스 수준이고 두 번째는 서버 수준 가장이며, 내가 알고 있고 여기에서 상황을 설명하지는 않습니다.
두 번째는 "실패"하지 않고 로그인에 서버 역할 (sysadmin)이 할당되어 있음을 나타냅니다. 사용자가 요청한 스키마를 확인 했습니까? dbo 기본 스키마가 개발자가 기대했던 것이 아닌 dbo 기본 스키마가 있기 전에. 테이블을 완전히 참조하여 코드에서 더 나은 수정
—
Stuart Moore