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

응용 프로그램 역할 기반 응용 프로그램이 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
피드백