ALTER VIEW

15/02/2007 - 13:15 por J.A. García Barceló | Informe spam
Buenos dias grupo:

Tengo algunas tablas y vistas que participan de la replicación entre 2
servidores (transaccional inmediata)
Algunas de estas vistas tienen WITH SCHEMABINDING para poder tener índices
sobre ellas.
Cuando tengo que hacer cambios en las tablas del publicador, me avisa de que
se perderán esos índices y la vista dejará de tener la opcion SCHEMABINDING
etc... ok ok, y luego vuelvo a modificar la vista y a recrear los índices y
todo vuelve a estar en marcha en el publicador.

Sin embargo, cuando vuelvo a republicar la tabla para que el subscriptor se
sincronice, tengo el mismo problema por lo que, en el pre-snapshot scripts
tengo que hacer un ALTER VIEW para quitarle el schemabinding, y el
post-snapshot script volver a dejar la vista con el schemabinding activo y
recrear los índices.

Y ahora la cosa rara: para hacer el presnapshot script, primero verifico si
la vista en cuestión existe antes de hacer el alter view:

USE [myDB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF OBJECT_ID('[dbo].[miconsulta]') IS NOT NULL
ALTER VIEW [dbo].[miconsulta]
AS
...
GO

Pero obtengo el siguiente error:

Mens. 156, Nivel 15, Estado 1, Línea 2
Sintaxis incorrecta cerca de la palabra clave 'VIEW'.

Sencillamente no lo entiendo. Hay alguna restricción por la que un ALTER
VIEW no pueda ir detras de un IF ?!?!?!

J.A. García Barceló
http://jagbarcelo.blogspot.com

Preguntas similare

Leer las respuestas

#6 AC
15/02/2007 - 18:29 | Informe spam
Bien. Quizás usando SQL dinámico ?

Quedaría:

IF OBJECT_ID('[MyTestView]') IS NOT NULL
exec sp_executesql
N'ALTER VIEW [dbo].[MyTestView] AS
SELECT CualquierCampo FROM CualquierTabla'
GO


"J.A. García Barceló" escribió en el mensaje
news:
Ya, ya... hacer un DROP y un CREATE ya se que funciona (lo he probado)


pero
no es lo que quiero, ya que al hacer drop y create pierdo todos los GRANTs
que ya tenía establecidos sobre la vista original. Teniendo en cuenta que


la
vista se publica mediante otra publicación diferente a esta para la que
estoy haciendo el pre-snapshot script, hacer aqui el drop/create y grants
creo que añadiría demasiada complejidad a todo el tinglado.

¿No hay manera de hacer un ALTER VIEW comprobando que la vista existe para
evitar errores en el script?

Un saludo.

J.A. García Barceló
http://jagbarcelo.blogspot.com


"AC" escribió en el mensaje
news:
> Sólo una cuetión ...
>
> ALTER VIEW, puede NO ser la primera instrucción de un lote ?
> Parece que no.
>
> La sintaxis de lo que sigue, el analizador da OK:
>
> USE [tempdb]
> GO
> SET ANSI_NULLS ON
> GO
> SET QUOTED_IDENTIFIER ON
> GO
> IF OBJECT_ID('[MyTestView]') IS NOT NULL
> DROP VIEW [dbo].[MyTestView]
> GO
> CREATE VIEW [dbo].[MyTestView] AS
> SELECT CualquierCampo FROM CualquierTabla
> GO
>
> "J.A. García Barceló" escribió en el mensaje
> news:
>> Simplificando el problema aún más:
>>
>> USE [tempdb]
>> GO
>> SET ANSI_NULLS ON
>> GO
>> SET QUOTED_IDENTIFIER ON
>> GO
>> IF OBJECT_ID('[MyTestView]') IS NOT NULL BEGIN
>> PRINT 'Ya existe, hacemos el alter view'
>> ALTER VIEW [dbo].[MyTestView] AS
>> SELECT CualquierCampo FROM CualquierTabla
>> END
>> GO
>>
>> Si metes ese código para una 'Nueva consulta' en el IDE de VS2005 y le
>> das
> a
>> Analizar (CTRL+F5) verás el error al que me refiero. No se trata de un
> error
>> en tiempo de ejecución (independiente de que existan las tablas
> subyacentes
>> o no) sino de un error de sintaxis:
>>
>> Mens. 156, Nivel 15, Estado 1, Línea 3
>> Sintaxis incorrecta cerca de la palabra clave 'VIEW'.
>>
>> ¿Alguien puede decirme que estoy haciendo mal?
>>
>> J.A. García Barceló
>> http://jagbarcelo.blogspot.com
>>
>> "Maxi" escribió en el mensaje
>> news:Oj3yX$
>> > Hola, ponele Begin y End dentro del if
>> >
>> >
>> > Salu2
>> >
>> > Microsoft MVP SQL Server
>> > Culminis Speaker
>> >
>> > "J.A. García Barceló" escribió en el
>> > mensaje
>> > news:
>> >> Buenos dias grupo:
>> >>
>> >> Tengo algunas tablas y vistas que participan de la replicación entre


2
>> >> servidores (transaccional inmediata)
>> >> Algunas de estas vistas tienen WITH SCHEMABINDING para poder tener
>> >> índices sobre ellas.
>> >> Cuando tengo que hacer cambios en las tablas del publicador, me


avisa
> de
>> >> que se perderán esos índices y la vista dejará de tener la opcion
>> >> SCHEMABINDING etc... ok ok, y luego vuelvo a modificar la vista y a
>> >> recrear los índices y todo vuelve a estar en marcha en el


publicador.
>> >>
>> >> Sin embargo, cuando vuelvo a republicar la tabla para que el
> subscriptor
>> >> se sincronice, tengo el mismo problema por lo que, en el


pre-snapshot
>> >> scripts tengo que hacer un ALTER VIEW para quitarle el


schemabinding,
>> >> y
>> >> el post-snapshot script volver a dejar la vista con el schemabinding

>> >> activo y recrear los índices.
>> >>
>> >> Y ahora la cosa rara: para hacer el presnapshot script, primero
> verifico
>> >> si la vista en cuestión existe antes de hacer el alter view:
>> >>
>> >> USE [myDB]
>> >> GO
>> >> SET ANSI_NULLS ON
>> >> GO
>> >> SET QUOTED_IDENTIFIER ON
>> >> GO
>> >> IF OBJECT_ID('[dbo].[miconsulta]') IS NOT NULL
>> >> ALTER VIEW [dbo].[miconsulta]
>> >> AS
>> >> ...
>> >> GO
>> >>
>> >> Pero obtengo el siguiente error:
>> >>
>> >> Mens. 156, Nivel 15, Estado 1, Línea 2
>> >> Sintaxis incorrecta cerca de la palabra clave 'VIEW'.
>> >>
>> >> Sencillamente no lo entiendo. Hay alguna restricción por la que un
> ALTER
>> >> VIEW no pueda ir detras de un IF ?!?!?!
>> >>
>> >> J.A. García Barceló
>> >> http://jagbarcelo.blogspot.com
>> >>
>> >>
>> >
>> >
>>
>>
>
>


Respuesta Responder a este mensaje
#7 J.A. García Barceló
15/02/2007 - 18:38 | Informe spam
Parece viable... tengo que hacer algunas pruebas antes de ponerlo en
producción.

Muchas gracias or la idea.

J.A. García Barceló
http://jagbarcelo.blogspot.com

"AC" escribió en el mensaje
news:
Bien. Quizás usando SQL dinámico ?

Quedaría:

IF OBJECT_ID('[MyTestView]') IS NOT NULL
exec sp_executesql
N'ALTER VIEW [dbo].[MyTestView] AS
SELECT CualquierCampo FROM CualquierTabla'
GO


"J.A. García Barceló" escribió en el mensaje
news:
Ya, ya... hacer un DROP y un CREATE ya se que funciona (lo he probado)


pero
no es lo que quiero, ya que al hacer drop y create pierdo todos los
GRANTs
que ya tenía establecidos sobre la vista original. Teniendo en cuenta que


la
vista se publica mediante otra publicación diferente a esta para la que
estoy haciendo el pre-snapshot script, hacer aqui el drop/create y grants
creo que añadiría demasiada complejidad a todo el tinglado.

¿No hay manera de hacer un ALTER VIEW comprobando que la vista existe
para
evitar errores en el script?

Un saludo.

J.A. García Barceló
http://jagbarcelo.blogspot.com


"AC" escribió en el mensaje
news:
> Sólo una cuetión ...
>
> ALTER VIEW, puede NO ser la primera instrucción de un lote ?
> Parece que no.
>
> La sintaxis de lo que sigue, el analizador da OK:
>
> USE [tempdb]
> GO
> SET ANSI_NULLS ON
> GO
> SET QUOTED_IDENTIFIER ON
> GO
> IF OBJECT_ID('[MyTestView]') IS NOT NULL
> DROP VIEW [dbo].[MyTestView]
> GO
> CREATE VIEW [dbo].[MyTestView] AS
> SELECT CualquierCampo FROM CualquierTabla
> GO
>
> "J.A. García Barceló" escribió en el
> mensaje
> news:
>> Simplificando el problema aún más:
>>
>> USE [tempdb]
>> GO
>> SET ANSI_NULLS ON
>> GO
>> SET QUOTED_IDENTIFIER ON
>> GO
>> IF OBJECT_ID('[MyTestView]') IS NOT NULL BEGIN
>> PRINT 'Ya existe, hacemos el alter view'
>> ALTER VIEW [dbo].[MyTestView] AS
>> SELECT CualquierCampo FROM CualquierTabla
>> END
>> GO
>>
>> Si metes ese código para una 'Nueva consulta' en el IDE de VS2005 y le
>> das
> a
>> Analizar (CTRL+F5) verás el error al que me refiero. No se trata de un
> error
>> en tiempo de ejecución (independiente de que existan las tablas
> subyacentes
>> o no) sino de un error de sintaxis:
>>
>> Mens. 156, Nivel 15, Estado 1, Línea 3
>> Sintaxis incorrecta cerca de la palabra clave 'VIEW'.
>>
>> ¿Alguien puede decirme que estoy haciendo mal?
>>
>> J.A. García Barceló
>> http://jagbarcelo.blogspot.com
>>
>> "Maxi" escribió en el mensaje
>> news:Oj3yX$
>> > Hola, ponele Begin y End dentro del if
>> >
>> >
>> > Salu2
>> >
>> > Microsoft MVP SQL Server
>> > Culminis Speaker
>> >
>> > "J.A. García Barceló" escribió en el
>> > mensaje
>> > news:
>> >> Buenos dias grupo:
>> >>
>> >> Tengo algunas tablas y vistas que participan de la replicación
>> >> entre


2
>> >> servidores (transaccional inmediata)
>> >> Algunas de estas vistas tienen WITH SCHEMABINDING para poder tener
>> >> índices sobre ellas.
>> >> Cuando tengo que hacer cambios en las tablas del publicador, me


avisa
> de
>> >> que se perderán esos índices y la vista dejará de tener la opcion
>> >> SCHEMABINDING etc... ok ok, y luego vuelvo a modificar la vista y a
>> >> recrear los índices y todo vuelve a estar en marcha en el


publicador.
>> >>
>> >> Sin embargo, cuando vuelvo a republicar la tabla para que el
> subscriptor
>> >> se sincronice, tengo el mismo problema por lo que, en el


pre-snapshot
>> >> scripts tengo que hacer un ALTER VIEW para quitarle el


schemabinding,
>> >> y
>> >> el post-snapshot script volver a dejar la vista con el
>> >> schemabinding



>> >> activo y recrear los índices.
>> >>
>> >> Y ahora la cosa rara: para hacer el presnapshot script, primero
> verifico
>> >> si la vista en cuestión existe antes de hacer el alter view:
>> >>
>> >> USE [myDB]
>> >> GO
>> >> SET ANSI_NULLS ON
>> >> GO
>> >> SET QUOTED_IDENTIFIER ON
>> >> GO
>> >> IF OBJECT_ID('[dbo].[miconsulta]') IS NOT NULL
>> >> ALTER VIEW [dbo].[miconsulta]
>> >> AS
>> >> ...
>> >> GO
>> >>
>> >> Pero obtengo el siguiente error:
>> >>
>> >> Mens. 156, Nivel 15, Estado 1, Línea 2
>> >> Sintaxis incorrecta cerca de la palabra clave 'VIEW'.
>> >>
>> >> Sencillamente no lo entiendo. Hay alguna restricción por la que un
> ALTER
>> >> VIEW no pueda ir detras de un IF ?!?!?!
>> >>
>> >> J.A. García Barceló
>> >> http://jagbarcelo.blogspot.com
>> >>
>> >>
>> >
>> >
>>
>>
>
>






email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida