2011-06-23 20 views
10

He heredado un proyecto bastante importante, que hace un uso extensivo de las vistas de SQL Server (2005 y 2008).SQL Server 2008 - sp_refreshview bombardeando algunas vistas

Un paso en el proceso de compilación es llamar al procedimiento almacenado del sistema sp_refreshviews, para asegurarse, ningún cambio en ninguna tabla ha roto nuestras vistas. Esto funciona bien .... excepto por unos tres o cuatro (de más de 200 puntos de vista ....)

Con esos, sólo bombas fuera - da mensajes de error extraños como

Msg 15165, nivel 16, Estado 1, Procedimiento sp_refreshsqlmodule_internal, Línea 55
no se pudo encontrar el objeto 'vYourViewNameHere' o usted no tiene permiso .

que es totalmente equivocado - que hace la vista existen, y que sin duda puede seleccionar de ella.

Parece que no puedo encontrar ninguna buena información concisa sobre por qué sucede esto, ¿qué lo desencadena ... alguna idea? ¿Hay algo que pueda hacer para detectar vistas tan problemáticas? ¿Puedo cambiar su definitino para que sean actualizables nuevamente?

Actualización: He registrado un informe de error en Microsoft Connect para esto - si acepta que esto parece extraño y necesita ser reparado, ¡vota por él!

https://connect.microsoft.com/SQLServer/feedback/details/676728/sp-refreshview-crashes-with-misleading-error-on-views-with-schemabinding

+0

¿Es esta [artículo Conectar] (http://connectppe.microsoft.com/SQLServer/feedback/details/669621/sp-refreshview-fails-for-views-that-were-created-without-explicitly -calificando-su-nombre-esquema) relevante para su situación? –

+0

@Joe Stefanelli: lo probé - el mismo resultado :-(Dejé caer una de esas vistas problemáticas, y la recreé con el esquema explícito en su lugar - aún no me gusta que me actualicen ... –

+0

sp_refreshview requiere permiso alternativo en la vista en cuestión. Mencionó que puede seleccionar, pero ¿puede modificar la vista individual con el mismo loging que está ejecutando sp_refreshview en? – RThomas

Respuesta

13

me di cuenta en los comentarios que mencionar que tiene SCHEMABINDING. Casi puedo garantizar que ese es el problema. Books online dice específicamente que esto es para usar en vistas no vinculadas al esquema.

Una vista enlazada al esquema no permitiría que se produzca un cambio de rotura, por lo que no es necesario actualizar los metadatos. Puedes saltearlo con seguridad.

Puede identificar todos los puntos de vista enlazada a un esquema como este:

SELECT * FROM sys.views WHERE OBJECTPROPERTY(object_id, 'IsSchemaBound')=1 
+0

Sí, lo es ... Siempre tuve la impresión de que esto impedía que las tablas subyacentes de cambiar - nunca imaginé que esto causaría que el sproc del sistema 'sp_refreshview' fallara en esas vistas ..... –

+1

Estoy sorprendido de que arroje un error yo mismo. Uno pensaría que simplemente lo ignoraría. – RThomas

+0

Sí, de hecho ... solo omita las vistas que tienen un 'CON ESQUEMA DE ESQUEMA 'en la actualización, ya que ellos mismos ya se aseguran de que nada ha cambiado .... además, el mensaje de error es realmente q uite críptico y engañoso, también ... –

0

Mi encarnación de este error fue:

Msg 8116, nivel 16, estado 1, sp_refreshsqlmodule_internal Procedimiento, Línea 75 Argumento tipo de datos int no es válido para el argumento 1 de la subcadena función.

Este mensaje de error se informó en varios lugares en el script db. Yo diría lugares equivocados. Si comenté el SQL en el que se informó este error, se informará el mismo error en otro lugar.

Comenté la siguiente llamada en mi secuencia de comandos como una solución, y la secuencia de comandos se completará correctamente.

-- EXECUTE sp_refreshview @viewName;

Nota: Mi base de datos no informaron tener una vista enlazada a un esquema cuando se ejecuta la consulta sugerido en respuesta adyacente RThomas' https://stackoverflow.com/a/6460532/179972

ACTUALIZACIÓN - SOLUCIÓN:

Después de nuestra La secuencia de comandos de la base de datos se ejecutó correctamente con el comando sp_refreshview comentado (mostrado arriba), luego ejecutamos el código de actualización de la vista por sí mismo, y también fue exitoso.

-
Esta respuesta no tiene sentido para mí en cuanto a cómo era capaz de trabajar con éxito, sin embargo he aquí la documentación en caso de que sea de utilidad para alguien más.

4

Me encontré con el mismo error al utilizar sp_helptext. En mi caso, la causa fue usar sp_rename para cambiar el nombre de la vista. El siguiente código reproduce este error.

create view demo as select dummy = 1 
go 

exec sp_rename 'demo', 'new_demo' 
go 

exec sp_refreshview 'new_demo' 
go 

La única solución es modificar manualmente la vista. Aplicar esta revisión a la solución anterior y se obtiene:

create view demo as select dummy = 1 
go 

exec sp_rename 'demo', 'new_demo' 
go 

-- This statement fixes the problem 
alter view new_demo as select dummy = 1 
go 

exec sp_refreshview 'new_demo' 
go 
0

para encontrar qué punto de vista es su problema añadir una impresión a los sppRefreshViews normales. Nada de tierra rompiéndose aquí, pero pensé que lo compartiría.

CREATE procedure sppRefreshViews2 

    as 
    declare @t varchar (1024) 

    declare tbl_cur cursor for 
    select TABLE_NAME from INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'VIEW' and table_name like 'sp%' 
    OPEN tbl_cur 

    FETCH NEXT from tbl_cur INTO @t 
    WHILE @@FETCH_STATUS = 0 
    BEGIN 
    print  @t 
    exec ('sp_refreshview ''' + @t + '''') 
    FETCH NEXT from tbl_cur INTO @t 
    END 

    CLOSE tbl_cur 
    DEALLOCATE tbl_Cur 
Cuestiones relacionadas