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

#1 Maxi
15/02/2007 - 13:47 | Informe spam
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
#2 J.A. García Barceló
15/02/2007 - 15:10 | Informe spam
Ya probé eso y sigue dando el mismo error. El BEGIN...END es para cuando
quieres meter varios statements dentro del IF, pero ALTER VIEW es en sí
mismo un único statement por lo que no es necesario.

Tanto con BEGIN .. END como sin ellos, el error es el mismo:

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

¿Alguna otra idea? Cuando se acaban las ideas lógicas, las ilógicas también
son bienvenidas.

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
#3 J.A. García Barceló
15/02/2007 - 15:37 | Informe spam
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
#4 AC
15/02/2007 - 17:11 | Informe spam
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
#5 J.A. García Barceló
15/02/2007 - 17:29 | Informe spam
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
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida