Puede recibir un mensaje de error "Permiso denegado" cuando una aplicación basada en funciones de aplicación intenta seleccionar registros de cualquiera de las tablas del sistema en la base de datos master de SQL Server 2005

Seleccione idioma Seleccione idioma
Id. de artículo: 906549 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

Síntomas

Si una aplicación basada en funciones de aplicación intenta seleccionar todos los registros de cualquier tabla del sistema en una base de datos master de Microsoft SQL Server 2005, es posible que se observe alguno de los siguientes síntomas:
  • No se devuelve ningún registro.
  • Recibe el mensaje de error siguiente:
    Permiso denegado.
Por ejemplo, este problema puede aparecer si la aplicación utiliza la siguiente consulta.
seleccionar * desde master.dbo.syslogins

Causa

Las aplicaciones basadas en funciones de aplicación están diseñadas para trabajar con información concreta en una base de datos. Estas aplicaciones no pueden tener acceso a las tablas del sistema en una vista maestra o en una vista de administración dinámica. Estas vistas contienen información de nivel de servidor.

Solución

Para resolver este problema, use procedimientos firmados y certificados para acceder a las tablas del sistema de nivel de servidor. Loa procedimientos firmados y certificados ofrecen las siguientes ventajas:
  • No resulta necesario emplear utilidades de seguimiento.
  • Se puede descubrir menos información de nivel de servidor. Las aplicaciones basadas en funciones de aplicación deben utilizar procedimientos almacenados en lugar de utilizar consultas generales. Los procedimientos almacenados tienen más probabilidades de devolver sólo datos concretos requeridos por la aplicación.

Solución

Para evitar este problema, habilite el indicador de seguimiento global 4616.

Más información

El siguiente código constituye un ejemplo de un procedimiento de firma certificado.
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

-----------------------------------------------------------------------Esta sección muestra cómo utilizar un certificado para autenticar -- un procedimiento firmado. ---------------------------------------------------------------------

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

---- Aquí debe utilizar el "autenticador" EJECUTE COMO debido a la función de aplicación -- no tiene una identidad del servidor. Por consiguiente, la función de aplicación no puede utilizar -- los permisos del certificado en el servidor.  Por consiguiente, usted -- necesita un nuevo contexto de ejecución al que puede conceder -- los permisos VIEW* necesarios. -- 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

-----------------------------------------------------------------------Debemos crear una copia del certificado de firma en el destino -- base de datos. En este caso, la base de datos de destino es la base de datos principal. -- Esta copia del certificado de firma puede atestiguar -- en el caso de los contextos de ejecución que se introducen en esta base de datos desde el -- procedimiento firmado. --------------------------------------------------------------------- USE master GO

CREATE CERTIFICATE signing_cert FROM FILE = 'signing_cert.cer' ; GO

---- Porque los permisos VIEW* en cuestión son permisos de nivel del servidor,-- necesitamos un AUTHENTICATE SERVER en un certificado asignado por inicio de sesión. -- CREATE LOGIN signing_cert_login FROM CERTIFICATE signing_cert ; GO

GRANT AUTHENTICATE SERVER TO signing_cert_login GO


-----------------------------------------------------------------------Ahora puede abrir una nueva conexión como "some_login" y -- establecer la función de aplicación. A continuación, llame a "access_server_system_tables" -- procedimiento y obtenga una comprobación de que puede tener acceso a información del nivel del servidor -- cuando se ejecuta la aplicación basada en funciones de aplicación.  




---------------------------------------------------------------------


-----------------------------------------------------------------------Limpie después del procedimiento.

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

----Asegúrese de eliminar el archivo de certificado. Por ejemplo, elimine -- C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\signing_cert.cer -- EXEC sp_configure 'mostrar opciones avanzadas', 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


--============================================================================--- El acceso de función de aplicación a información del servidor - usage.sql de la Demostración------Este código es código del libro guía que muestra un ejemplo de acceso de función de aplicación--a información del servidor utilizando un procedimiento firmado por certificado. -- -- ============================================================================

----------------------------------------------------Conecte como some_login -------------------------------------------------- USE approle_db GO

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

EXEC access_server_system_tables GO

Propiedades

Id. de artículo: 906549 - Última revisión: martes, 20 de noviembre de 2007 - Versión: 2.2
La información de este artículo se refiere a:
  • 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
Palabras clave: 
kbtshoot kbprb kbsql2005engine KB906549

Enviar comentarios

 

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