현재 오프라인 상태입니다. 인터넷에 다시 연결하기를 기다리고 있습니다.

이 브라우저는 지원되지 않습니다.

사이트를 사용하여 브라우저를 업데이트해야 합니다.

최신 버전의 Internet Explorer를 업데이트하세요.

응용 프로그램 역할 기반 응용 프로그램이 SQL Server 2005 마스터 데이터베이스의 시스템 테이블 중 하나에서 레코드를 선택하려고 하면 "사용 권한이 거부되었습니다." 오류 메시지가 나타날 수 있다

현상
응용 프로그램 역할 기반 응용 프로그램이 Microsoft SQL Server 2005 마스터 데이터베이스의 시스템 테이블 중 하나에서 모든 레코드를 선택하려고 하면 다음과 같은 현상이 발생할 수 있습니다.
  • 레코드가 반환되지 않습니다.
  • 다음 오류 메시지가 나타납니다.
    사용 권한이 거부되었습니다.
예를 들어, 이 문제는 응용 프로그램이 다음 쿼리를 사용하는 경우에 발생할 수 있습니다.
select * from master.dbo.syslogins
원인
응용 프로그램 역할 기반 응용 프로그램은 데이터베이스의 특정 정보를 사용하여 작업하도록 설계되었습니다. 이러한 응용 프로그램은 마스터 보기나 동적 관리 보기에서 시스템 테이블에 액세스할 수 없습니다. 이러한 보기에는 서버 수준 정보가 포함되어 있습니다.
해결 방법
이 문제를 해결하려면 인증서 서명 프로시저를 사용하여 서버 수준 시스템 테이블에 액세스하십시오. 인증서 서명 프로시저는 다음과 같은 이점을 제공합니다.
  • 플래그 추적을 사용하지 않아도 됩니다.
  • 서버 수준보다 낮은 수준의 정보를 표시할 수 있습니다. 응용 프로그램 역할 기반 응용 프로그램은 일반 쿼리를 사용하는 대신 저장 프로시저를 사용해야 합니다. 저장 프로시저는 응용 프로그램에 필요한 특정 데이터만 반환할 확률이 높습니다.
해결 과정
이 문제를 해결하려면 전역 추적 플래그 4616을 사용하도록 설정하십시오.
추가 정보
다음 코드 예제에서는 인증서 서명 프로시저를 보여줍니다.
USE masterGOCREATE DATABASE approle_db ;GOCREATE LOGIN some_login WITH PASSWORD = 'SomePa$$word!' ;GOUSE approle_dbGOCREATE USER some_user FOR LOGIN some_loginGOEXEC sp_addapprole 'an_approle', 'SomeAppRolePa$$word!' ;GO----------------------------------------------------------------------- This section shows how to use a certificate to authenticate-- a signed procedure.---------------------------------------------------------------------CREATE LOGIN execute_as_login WITH PASSWORD = 'SomePa$$word!' ;GOUSE masterGOGRANT VIEW ANY DEFINITION TO execute_as_login ;GRANT VIEW SERVER STATE   TO execute_as_login ;GOUSE approle_dbGOCREATE USER execute_as_user FOR LOGIN execute_as_login ;GO---- You must use EXECUTE AS 'authenticator' here because the application role-- does not have a server identity. Therefore, the application role cannot use-- the certificate permissions on the server.  Therefore, you-- need a new execution context to which you can grant-- the needed VIEW* permissions.--CREATE PROC access_server_system_tables  WITH EXECUTE AS 'execute_as_user'AS  SELECT * FROM master.dbo.syslogins    ;  SELECT * FROM master.dbo.sysprocesses ;GOGRANT EXECUTE ON access_server_system_tables TO an_approle ;GOCREATE CERTIFICATE signing_cert ENCRYPTION BY PASSWORD = 'SomeCertPa$$word'    WITH SUBJECT  = 'Signing Cert' ;GOBACKUP CERTIFICATE signing_cert TO FILE = 'signing_cert.cer' ;GOADD SIGNATURE TO access_server_system_tables    BY CERTIFICATE signing_cert WITH PASSWORD = 'SomeCertPa$$word' ;GO----------------------------------------------------------------------- We must create a copy of the signing certificate in the targetdatabase. In this case, the target database is the master database.-- This copy of the signing certificate can vouch-- for the execution contexts that enter this database from the-- signed procedure.---------------------------------------------------------------------USE masterGOCREATE CERTIFICATE signing_cert FROM FILE = 'signing_cert.cer' ;GO---- Because the VIEW* permissions in question are server-level permissions,-- we need an AUTHENTICATE SERVER on a login-mapped certificate.--CREATE LOGIN signing_cert_login FROM CERTIFICATE signing_cert ;GOGRANT AUTHENTICATE SERVER TO signing_cert_loginGO----------------------------------------------------------------------- Now you can open a new connection as "some_login" and-- set the application role. Then, call the "access_server_system_tables"-- procedure, and obtain verification that you can access server-level information-- when the application role-based application runs.  -------------------------------------------------------------------------------------------------------------------------------------------- Clean up after the procedure.---------------------------------------------------------------------USE masterGODROP DATABASE approle_db ;GODROP LOGIN some_login;GODROP LOGIN execute_as_login;GODROP LOGIN signing_cert_login ;GODROP CERTIFICATE signing_cert;GO---- Make sure to delete the certificate file. For example, delete-- C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\signing_cert.cer--sp_configure 'show advanced options', 1GORECONFIGUREGOEXEC sp_configure 'xp_cmdshell', 1 ;GORECONFIGUREGOEXEC xp_cmdshell 'del "C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\signing_cert.cer"' ;GOEXEC sp_configure 'xp_cmdshell', 0 ;GORECONFIGUREGO-- ============================================================================-- - Application role access to server information - Demo usage.sql------  This code is companion code that shows an example of application role access--  to server information by using a certificate-signed procedure.---- ============================================================================---------------------------------------------------- Connect as some_login--------------------------------------------------USE approle_dbGOEXEC sp_setapprole 'an_approle', 'SomeAppRolePa$$word!'GOEXEC access_server_system_tablesGO




Microsoft 제품 관련 기술 전문가들과 온라인으로 정보를 교환하시려면 Microsoft 뉴스 그룹에 참여하시기 바랍니다.
속성

문서 ID: 906549 - 마지막 검토: 11/20/2007 17:43:00 - 수정: 2.2

  • Microsoft SQL Server 2005 Developer Edition
  • Microsoft SQL Server 2005 Enterprise Edition
  • Microsoft SQL Server 2005 Enterprise Edition for Itanium Based Systems
  • Microsoft SQL Server 2005 Enterprise X64 Edition
  • Microsoft SQL Server 2005 Express Edition
  • Microsoft SQL Server 2005 Standard Edition
  • Microsoft SQL Server 2005 Standard Edition for Itanium Based Systems
  • Microsoft SQL Server 2005 Standard X64 Edition
  • Microsoft SQL Server 2005 Workgroup Edition
  • kbtshoot kbprb kbsql2005engine KB906549
피드백