Uygulama rolü tabanlı bir uygulama SQL Server 2005 master veritabanındaki sistem tablolarının herhangi birinden kayıtları seçerken "Izin reddedildi" hata iletisini alabilirsiniz

Belirtiler

Uygulama rolü tabanlı bir uygulama Microsoft SQL Server 2005 master veritabanındaki sistem tablolarından herhangi birinin tüm kayıtlarını seçmek için aşağıdaki belirtilerden biriyle karşılaşabilirsiniz:

  • Hiçbir kayıt döndürülmez.

  • Aşağıdaki hata iletisini alırsınız:

    İzin reddedildi.

Örneğin, uygulama aşağıdaki sorguyu kullandığında bu sorun oluşabilir.

select * from master.dbo.syslogins

Neden

Uygulama rolü tabanlı uygulamalar veritabanındaki belirli bilgilerle çalışmak üzere tasarlanmıştır. Bu uygulamalar, ana görünümdeki veya dinamik yönetim görünümündeki sistem tablolarına erişemez. Bu görünümler sunucu düzeyindeki bilgileri içerir.

Çözüm

Bu sorunu çözmek için, sertifika imzalamış yordamları kullanarak sunucu düzeyi sistem tablolarına erişin. Sertifika-imzalayan yordamları aşağıdaki avantajları sağlar:

  • İzleme bayraklarını kullanmak zorunda değilsiniz.

  • Daha çok sunucu düzeyi bilgisi görüntülenebilir. Uygulama rolü tabanlı uygulamalar, genel sorguları kullanmak yerine saklı yordamlar kullanmalıdır. Depolanan yordamlar, yalnızca uygulama için gereken belirli verileri döndürmenin daha olasıdır.

Geçici Çözüm

Bu soruna geçici bir çözüm için, Genel izleme bayrağını 4616.

Ek Bilgi

Aşağıdaki kod örneği, sertifika imzalamış bir yordam örneğidir.

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 target-- database. 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--EXEC sp_configure 'show advanced options', 1 ;GORECONFIGURE ;GOEXEC sp_configure 'xp_cmdshell', 1 ;GORECONFIGURE ;GOEXEC xp_cmdshell 'del "C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\signing_cert.cer"' ;GOEXEC sp_configure 'xp_cmdshell', 0 ;GORECONFIGURE ;GO-- ============================================================================-- - 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

Daha fazla yardıma mı ihtiyacınız var?

Yeteneklerinizi geliştirin
Eğitimleri keşfedin
Yeni özellikleri ilk olarak siz edinin
Microsoft Insider 'a katılın

Bu bilgi yardımcı oldu mu?

Geri bildiriminiz için teşekkür ederiz!

Geri bildiriminiz için teşekkürler! Office destek temsilcilerimizden biriyle görüşmeniz yararlı olabilir.

×