คุณอาจได้รับข้อความแสดง "สิทธิ์ที่ถูกปฏิเสธ" ข้อผิดพลาดข้อเมื่อโปรแกรมประยุกต์ตามบทบาทแอพลิเคชันพยายามเลือกระเบียนจากใด ๆ หนึ่งตารางระบบในฐานข้อมูล SQL Server 2005 หลัก

การแปลบทความ การแปลบทความ
หมายเลขบทความ (Article ID): 906549 - ผลิตภัณฑ์ที่เกี่ยวข้องในบทความนี้
ขยายทั้งหมด | ยุบทั้งหมด

อาการ

หากโปรแกรมประยุกต์ตามบทบาทโปรแกรมประยุกต์พยายามที่จะเลือกเรกคอร์ดทั้งหมดจากหนึ่งตารางระบบในฐานข้อมูล Microsoft SQL Server 2005 หลัก คุณอาจพบอาการต่อไปนี้อย่างใดอย่างหนึ่ง:
  • ไม่มีระเบียนส่งคืน
  • คุณได้รับข้อความแสดงข้อผิดพลาดต่อไปนี้:
    สิทธิ์ที่ถูกปฏิเสธ
ตัวอย่างเช่น ปัญหานี้อาจเกิดขึ้นหากโปรแกรมประยุกต์ใช้การสอบถามต่อไปนี้
select * from master.dbo.syslogins

สาเหตุ

โปรแกรมประยุกต์ตามบทบาทของแอพลิเคชันจะได้รับการออกแบบการทำงานกับข้อมูลเฉพาะในฐานข้อมูล โปรแกรมประยุกต์เหล่านี้ไม่สามารถเข้าถึงตารางระบบ ในมุมมองต้นแบบ หรือ ในมุมมองการจัดการแบบไดนามิก มุมมองเหล่านี้ประกอบด้วยรายละเอียดระดับของเซิร์ฟเวอร์

การแก้ไข

เมื่อต้องการแก้ไขปัญหานี้ ใช้วิธีการที่ใบรับรองการเซ็นชื่อตารางระบบเซิร์ฟเวอร์ระดับการเข้าถึง วิธีการที่ใบรับรองการเซ็นชื่อมีประโยชน์ต่อไปนี้:
  • คุณไม่มีการใช้ค่าสถานะการสืบค้นกลับ
  • อาจถูกเปิดเผยข้อมูลน้อยลงระดับของเซิร์ฟเวอร์ โปรแกรมประยุกต์ตามบทบาทของโปรแกรมประยุกต์ต้องใช้กระบวนงานที่เก็บไว้แทนการใช้การสอบถามทั่วไป วิธีการที่เก็บไว้มีแนวโน้มเพิ่มเติมที่จะส่งค่าข้อมูลเฉพาะเท่านั้นที่ต้องใช้ โดยโปรแกรมประยุกต์

การหลีกเลี่ยงปัญหา

เมื่อต้องการแก้ไขปัญหานี้ เปิดใช้การตั้งค่าสถานะของการสืบค้นกลับสากล 4616

ข้อมูลเพิ่มเติม

ตัวอย่างรหัสต่อไปนี้เป็นตัวอย่างของกระบวนการใบรับรองการเซ็นชื่อ
USE master
GO

CREATE DATABASE approle_db ;
GO

CREATE LOGIN some_login WITH PASSWORD = 'SomePa$$word!' ;
GO

USE approle_db
GO

CREATE USER some_user FOR LOGIN some_login
GO

EXEC 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!' ;
GO

USE master
GO

GRANT VIEW ANY DEFINITION TO execute_as_login ;
GRANT VIEW SERVER STATE   TO execute_as_login ;
GO

USE approle_db
GO

CREATE 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 ;
GO

GRANT EXECUTE ON access_server_system_tables TO an_approle ;
GO

CREATE CERTIFICATE signing_cert ENCRYPTION BY PASSWORD = 'SomeCertPa$$word'
    WITH SUBJECT  = 'Signing Cert' ;
GO

BACKUP CERTIFICATE signing_cert TO FILE = 'signing_cert.cer' ;
GO

ADD 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 master
GO

CREATE 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 ;
GO

GRANT AUTHENTICATE SERVER TO signing_cert_login
GO


---------------------------------------------------------------------
-- 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 master
GO

DROP DATABASE approle_db ;
GO

DROP LOGIN some_login;
GO

DROP LOGIN execute_as_login;
GO

DROP LOGIN signing_cert_login ;
GO

DROP 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 ;
GO
RECONFIGURE ;
GO
EXEC sp_configure 'xp_cmdshell', 1 ;
GO
RECONFIGURE ;
GO

EXEC xp_cmdshell 'del "C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\signing_cert.cer"' ;
GO

EXEC sp_configure 'xp_cmdshell', 0 ;
GO
RECONFIGURE ;
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_db
GO

EXEC sp_setapprole 'an_approle', 'SomeAppRolePa$$word!'
GO

EXEC access_server_system_tables
GO

คุณสมบัติ

หมายเลขบทความ (Article ID): 906549 - รีวิวครั้งสุดท้าย: 16 มกราคม 2554 - Revision: 2.0
ใช้กับ
  • Microsoft SQL Server 2005 Developer Edition
  • Microsoft SQL 2005 Server Enterprise
  • 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 2005 Server Workgroup
Keywords: 
kbsql2005engine kbtshoot kbprb kbmt KB906549 KbMtth
แปลโดยคอมพิวเตอร์
ข้อมูลสำคัญ: บทความนี้แปลโดยซอฟต์แวร์การแปลด้วยคอมพิวเตอร์ของ Microsoft แทนที่จะเป็นนักแปลที่เป็นบุคคล Microsoft มีบทความที่แปลโดยนักแปลและบทความที่แปลด้วยคอมพิวเตอร์ เพื่อให้คุณสามารถเข้าถึงบทความทั้งหมดในฐานความรู้ของเรา ในภาษาของคุณเอง อย่างไรก็ตาม บทความที่แปลด้วยคอมพิวเตอร์นั้นอาจมีข้อบกพร่อง โดยอาจมีข้อผิดพลาดในคำศัพท์ รูปแบบการใช้ภาษาและไวยากรณ์ เช่นเดียวกับกรณีที่ชาวต่างชาติพูดผิดเมื่อพูดภาษาของคุณ Microsoft ไม่มีส่วนรับผิดชอบต่อความคลาดเคลื่อน ความผิดพลาดหรือความเสียหายที่เกิดจากการแปลเนื้อหาผิดพลาด หรือการใช้บทแปลของลูกค้า และ Microsoft มีการปรับปรุงซอฟต์แวร์การแปลด้วยคอมพิวเตอร์อยู่เป็นประจำ
ต่อไปนี้เป็นฉบับภาษาอังกฤษของบทความนี้:906549

ให้ข้อเสนอแนะ

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com