Solucionar problemas de visibilidad de los metadatos en vistas distribuidas con particiones

Nuevo: 5 de diciembre de 2005

Si un usuario con privilegios bajos intenta insertar, actualizar o eliminar datos mediante una vista distribuida con particiones, SQL Server genera el siguiente error:

Error 4436 "No se puede actualizar la vista '%.*ls' de tipo UNION ALL porque no se encontró una columna de partición".

Este problema no afecta a las vistas con particiones locales, como cuando existen todas las tablas subyacentes en la misma instancia de SQL Server.

Antecedentes

Para consultas distribuidas, SQL Server debe poder leer la definición SQL de restricciones CHECK en las tablas del servidor remoto (vinculado). Esto significa que quien llama a una consulta distribuida debe tener permiso CONTROL, ALTER, TAKE OWNERSHIP o VIEW DEFINITION en la tabla remota. Si quien llama a la consulta distribuida no tiene uno de estos permisos, la consulta genera el error 4436.

[!NOTA] Si un usuario no tiene ninguno de estos permisos, el valor de la columna definition en sys.check_constraints es NULL cuando el usuario consulta el catálogo.

Para resolver el error 4436

Para que la definición de la restricción CHECK sea visible para el autor de la llamada, concédale el permiso VIEW DEFINITION en todas las tablas de destino que subyacen en la vista distribuida con particiones.

Por ejemplo, supongamos que Server1 y Server2 son servidores federados y que se han definido como servidores vinculados entre sí. Supongamos que master.dbo.t1 es la tabla con particiones a la que pueden tener acceso todos los miembros de la función de base de datos dpv_users. Supongamos que dpv_users contiene todos los usuarios que tienen acceso SELECT, INSERT, UPDATE y DELETE mediante la vista distribuida con particiones.

Ejecute el siguiente código en cada servidor vinculado.

CREATE TABLE t1(c INT PRIMARY KEY CHECK (...)) ; -- CHECK is different on each server.
GO

GRANT SELECT, INSERT, UPDATE, DELETE, VIEW DEFINITION ON t1 TO dpv_users ;
GO

CREATE VIEW the_dpv AS
    SELECT * FROM Server1.master.dbo.t1
    UNION ALL
    SELECT * FROM Server2.master.dbo.t1 
GO

Vea también

Tareas

Solucionar problemas de visibilidad de los metadatos

Conceptos

Configuración de visibilidad de los metadatos
Crear vistas distribuidas con particiones

Otros recursos

CREATE VIEW (Transact-SQL)
GRANT (Transact-SQL)

Ayuda e información

Obtener ayuda sobre SQL Server 2005