sql server - stored - Problema de permisos en SSMS: "El permiso SELECT fue denegado en el objeto ''extended_properties'', base de datos ''mssqlsystem_resource'',... Error 229)"
grant trigger sql server (4)
SSMS intenta obtener las propiedades extendidas de la tabla usando fn_listextendedproperty
. Según MSDN, los permisos necesarios para ver las propiedades extendidas de una tabla son
ALTERAR en la tabla OBJECT
Su prueba de inicio de sesión debe tener esta permsisión como propietario de la tabla de prueba (es el propietario, ¿no?). Pero incluso si no tiene permisos en la tabla, la consulta de propiedades extendidas debería devolver el conjunto de resultados emtpy, no el acceso denegado. El hecho de que obtenga un error de acceso denegado en un objeto sys en la base de datos de recursos indica que la firma de código de la base de datos de recursos del sistema (mssqlsystemresource) está rota. ¿Retiró alguno de los certificados ''##'' del maestro? ¿Alteó manualmente algún objeto en la base de datos de recursos?
De todos modos, en este momento tiene una instancia que parece una instancia corrupta y le recomendaría que se ponga en contacto con el servicio de asistencia técnica para obtener un estado coherente.
Aquí está el caso de repro más simple posible.
- Crea una nueva base de datos. (Estoy usando SQL 2005.)
- Cree un inicio de sesión, un usuario de SQL y una tabla en la nueva base de datos (vea el código de ejemplo a continuación).
- Inicie SSMS y abra el Explorador de objetos, inicie sesión como el usuario recién creado .
- Intente abrir la carpeta "Tablas" en el Explorador de objetos.
El problema
Falla con este mensaje de error
Mensaje de texto:
TÍTULO: Microsoft SQL Server Management Studio
Error al recuperar datos para esta solicitud. (Microsoft.SqlServer.Management.Sdk.Sfc)
Para ayuda, haga clic en: enlace
INFORMACIÓN ADICIONAL:
Se produjo una excepción al ejecutar una instrucción o lote de Transact-SQL. (Microsoft.SqlServer.ConnectionInfo)
El permiso SELECT fue denegado en el objeto ''extended_properties'', base de datos mssqlsystemresource '', esquema'' sys ''. (Microsoft SQL Server, error: 229)
Para ayuda, haga clic en: enlace
Este usuario puede acceder a la tabla y al registro en la tabla. Pero el usuario no puede acceder a la lista de tablas en el Explorador de objetos.
SELECT USER_NAME() AS CurrentUser, col1
FROM dbo.TestTable
CurrentUser col1
----------- ----
robg_test 1000
La única solución alternativa que he encontrado es otorgar al usuario privilegios superiores a los necesarios (como db_datareader).
La pregunta:
¿Cuál es el privilegio mínimo requerido para permitir que este usuario abra la lista de la tabla en el Explorador de objetos?
He intentado otorgar al usuario varios privilegios en el esquema dbo, pero eso no ayudó.
Tenga en cuenta también que estoy usando un usuario de SQL simplemente para ilustrar el problema. El problema original fue con un usuario de AD.
Aquí hay una pregunta relativamente similar en serverfault.
Código
SET NOCOUNT ON
USE master
GO
IF EXISTS (SELECT * FROM sys.server_principals WHERE name = N''robg_test'')
DROP LOGIN [robg_test]
GO
CREATE LOGIN [robg_test]
WITH
PASSWORD = N''CLK63!!black'',
DEFAULT_DATABASE = [RGTest],
DEFAULT_LANGUAGE = [us_english],
CHECK_EXPIRATION = OFF,
CHECK_POLICY = ON
GO
IF EXISTS (SELECT * FROM sys.databases WHERE name = ''RGTest'')
DROP DATABASE [RGTest]
GO
CREATE DATABASE [RGTest]
GO
USE [RGTest]
GO
CREATE USER [robg_test] FOR LOGIN [robg_test] WITH DEFAULT_SCHEMA = [dbo]
GO
CREATE TABLE dbo.TestTable (col1 int)
GO
GRANT SELECT ON dbo.TestTable TO [robg_test]
GO
INSERT INTO dbo.TestTable VALUES (1000)
GO
Tuve un problema similar. Lo resolví agregando al usuario al rol público. Pero si no quería hacer eso, también descubrí que podría resolverse otorgando permiso al usuario para ver las propiedades sys.extended (en Vistas del sistema dentro de la base de datos a la que está intentando acceder)
Tuve un problema similar y lo resolví quitando dos roles db_denydatareader y db_denydatawriter para ese usuario y agregué otros roles. Usé el estudio de gestión sql.
Por favor, compruebe que no ha verificado la db_denydatareader
datos de db_denydatareader
. Al quitar ese cheque, funcionó para mí.