Luego de modificar una tabla

17/12/2007 - 23:41 por Pablo Rodríguez | Informe spam
Hola grupo, hace un tiempo que busco una solución a este problema, pero
hasta el momento no la he encontrado. Cada vez que modifico la
estructura de una tabla tengo que ejecutar ALTER sobre las vistas y
funciones que trabajan sobre esa basa porque sino los cambios no son
visibles.

Hay alguna manera de automatizar ese proceso?


Saludos y gracias por adelantado.

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
18/12/2007 - 15:32 | Informe spam
Hola Pablo,

Cuando declaras la vista, especifas las columnas que deseas incluir en ella,
si modificas la tabla y añades nuevas columnas, entonces deberas modificar la
vista para uncluir esas columnas nuevas en caso de querer estas dentro de la
vista. Lo mismo pasa si eliminas una columna de la tabla, tendras que
actualizar las vistas que referencian esa columna.

Lo mismo sucede si estas usando "select *" en la definicion de la vista, lo
cual no es una buena practica, ya que durante la creacion de la vista, SQL
Server busca los nombres de las columnas existentens en el momento de la
creacion de la vista y usara los nombres de las columnas en vez del "*". Eso
lo puedes ver en la vista de sistema INFORMATION_SCHEMA.COLUMNS. Para que las
vistas que usan "*" en su definicion tomen en cuenta las columnas eliminadas
y las nuevas, debes recrear la vista manualmente usando ALTER VIEW o DROP
VIEW / CREATE VIEW o usar el procedimineto almacenado de sistema
sp_refreshview, para refrescar la metadata de las vistas. Puedes usar un
cursor para recorrer INFORMATION_SCHEMA.TABLES donde TABLE_TYPE = 'VIEW'.


DECLARE @sql NVARCHAR(4000)
DECLARE @ts sysname
DECLARE @tn sysname
DECLARE c CURSOR LOCAL FAST_FORWARD
FOR
SELECT
TABLE_SCHEMA, TABLE_NAME
FROM
INFORMATION_SCHEMA.TABLES
WHERE
TABLE_TYPE = 'VIEW'
AND OBJECTPROPERTY(OBJECT_ID(QUOTENAME(TABLE_SCHEMA) + '.' +
QUOTENAME(TABLE_NAME)), 'IsMSShipped') = 0

OPEN c

WHILE 1 = 1
BEGIN
FETCH NEXT FROM c INTO @ts, @tn

IF @@ERROR != 0 OR @@FETCH_STATUS != 0 BREAK

SET @sql = N'exec sp_refreshview ''' + QUOTENAME(@ts) + '.' +
QUOTENAME(@tn) + ''''
EXEC sp_executesql @sql
END

CLOSE c
DEALLOCATE c
GO


AMB

"Pablo Rodríguez" <"prodriguez[antispam]" wrote:

Hola grupo, hace un tiempo que busco una solución a este problema, pero
hasta el momento no la he encontrado. Cada vez que modifico la
estructura de una tabla tengo que ejecutar ALTER sobre las vistas y
funciones que trabajan sobre esa basa porque sino los cambios no son
visibles.

Hay alguna manera de automatizar ese proceso?


Saludos y gracias por adelantado.

Respuesta Responder a este mensaje
#2 Pablo Rodríguez
19/12/2007 - 15:22 | Informe spam
Hola Alejandro, gracias por la respuesta, algo así es lo que necesitaba,
ahora lo voy a probar, me intriga saber si lo puedo usar con funciones
y sp... pero es cuestión de probar.


Saludos!

Alejandro Mesa escribió:
Hola Pablo,

Cuando declaras la vista, especifas las columnas que deseas incluir en ella,
si modificas la tabla y añades nuevas columnas, entonces deberas modificar la
vista para uncluir esas columnas nuevas en caso de querer estas dentro de la
vista. Lo mismo pasa si eliminas una columna de la tabla, tendras que
actualizar las vistas que referencian esa columna.

Lo mismo sucede si estas usando "select *" en la definicion de la vista, lo
cual no es una buena practica, ya que durante la creacion de la vista, SQL
Server busca los nombres de las columnas existentens en el momento de la
creacion de la vista y usara los nombres de las columnas en vez del "*". Eso
lo puedes ver en la vista de sistema INFORMATION_SCHEMA.COLUMNS. Para que las
vistas que usan "*" en su definicion tomen en cuenta las columnas eliminadas
y las nuevas, debes recrear la vista manualmente usando ALTER VIEW o DROP
VIEW / CREATE VIEW o usar el procedimineto almacenado de sistema
sp_refreshview, para refrescar la metadata de las vistas. Puedes usar un
cursor para recorrer INFORMATION_SCHEMA.TABLES donde TABLE_TYPE = 'VIEW'.


DECLARE @sql NVARCHAR(4000)
DECLARE @ts sysname
DECLARE @tn sysname
DECLARE c CURSOR LOCAL FAST_FORWARD
FOR
SELECT
TABLE_SCHEMA, TABLE_NAME
FROM
INFORMATION_SCHEMA.TABLES
WHERE
TABLE_TYPE = 'VIEW'
AND OBJECTPROPERTY(OBJECT_ID(QUOTENAME(TABLE_SCHEMA) + '.' +
QUOTENAME(TABLE_NAME)), 'IsMSShipped') = 0

OPEN c

WHILE 1 = 1
BEGIN
FETCH NEXT FROM c INTO @ts, @tn

IF @@ERROR != 0 OR @@FETCH_STATUS != 0 BREAK

SET @sql = N'exec sp_refreshview ''' + QUOTENAME(@ts) + '.' +
QUOTENAME(@tn) + ''''
EXEC sp_executesql @sql
END

CLOSE c
DEALLOCATE c
GO


AMB

"Pablo Rodríguez" <"prodriguez[antispam]" wrote:

Hola grupo, hace un tiempo que busco una solución a este problema, pero
hasta el momento no la he encontrado. Cada vez que modifico la
estructura de una tabla tengo que ejecutar ALTER sobre las vistas y
funciones que trabajan sobre esa basa porque sino los cambios no son
visibles.

Hay alguna manera de automatizar ese proceso?


Saludos y gracias por adelantado.

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