Cambiar el tamaño de una columna a la que hace referencia una vista vinculada a un esquema en SQL Server


124

Estoy tratando de cambiar el tamaño de una columna en el servidor SQL usando:

ALTER TABLE [dbo].[Address]
ALTER COLUMN [Addr1] [nvarchar](80) NULL

donde la longitud de Addr1era originalmente 40.

Falló, provocando este error:

The object 'Address_e' is dependent on column 'Addr1'.
ALTER TABLE ALTER COLUMN Addr1 failed because one or more objects access 
this column.

Intenté leerlo y parece que debido a que algunas vistas hacen referencia a esta columna y parece que SQL Server realmente está tratando de eliminar la columna que provocó el error.

Address_e es una vista creada por el administrador de base de datos anterior.

¿Hay alguna otra forma en que pueda cambiar el tamaño de la columna?


2
Address_e es una vista creada por el administrador de base de datos anterior. Y al igual que lo que Remus mencionó, tiene SCHEMABINDING definido.
Staelen

Respuestas:


58

Las vistas probablemente se crean utilizando la opción WITH SCHEMABINDING y esto significa que están explícitamente conectadas para evitar dichos cambios. Parece que la combinación de esquemas funcionó y te impidió romper esas opiniones, día de suerte, ¿eh? Póngase en contacto con el administrador de su base de datos y pídale que haga el cambio, después de que afirme el impacto en la base de datos.

De MSDN :

ESQUEMAS

Vincula la vista al esquema de la tabla o tablas subyacentes. Cuando se especifica SCHEMABINDING, la tabla o tablas base no se pueden modificar de una manera que afecte la definición de la vista. La definición de vista en sí debe modificarse o descartarse primero para eliminar las dependencias de la tabla que se va a modificar.


1
gracias Remus, la vista tiene SCHEMABINDING definido. ¿Hay alguna manera fácil de eludir la restricción o realmente necesito eliminar las vistas para que funcione?
Staelen

1
No puedes evitarlo, ese es todo su propósito. Alguien hizo un esfuerzo adicional para agregar el esquema de enlace para evitar cambios en la tabla. Esto no es un accidente, parece que la persona sabe lo que estaba haciendo. ¿Estás seguro de que quieres cambiar la mesa?
Remus Rusanu

1
sí, estoy seguro =) y lógicamente (aunque sé que no funciona de esa manera) estoy aumentando la longitud de la columna, lo que realmente debería estar bien solo si la columna no se cae y se recrea, pero lamentablemente no es así ... pero gracias por tu ayuda! = D
Staelen

2
Estoy viendo el mismo problema y desafortunadamente estamos usando vistas SCHEMABINDING para indexar las vistas. Entonces, en mi caso, no estoy usando SCHEMABINDING para bloquear explícitamente los cambios en las tablas subyacentes, sino solo para cumplir con los requisitos de SQL Server para usar vistas indexadas. También me gustaría omitir esto sin perder y recrear mis puntos de vista.
jpierson

256
ALTER TABLE [table_name] ALTER COLUMN [column_name] varchar(150)

11
no, el problema era como lo que Remus mencionó. no hay nada malo con el código en sí mismo
Staelen

11
@NilRad Ummm, ¿tal vez estás pensando en PL-SQL? ALTER COLUMN es la sintaxis correcta en SQL 2008 R2
schmidlop

44
¿Me estoy perdiendo de algo? ¿Por qué tantos votos a favor? No responde la pregunta.
Andy Wiesendanger

13
El número de votos positivos puede deberse a que esta pregunta es actualmente el principal éxito de Google para 'tsql alter nvarchar length' y, por lo tanto, las personas (como yo) que solo quieren que se les recuerde cómo alterar la longitud de una columna, vea esta respuesta y más -Vótelo para decir "gracias" sin ver (como no hice hasta que leí tu comentario) que la pregunta es más sutil de lo que sugiere el título de la pregunta.
dumbledad

6

Si alguien quiere "Aumentar el ancho de columna de la tabla replicada" en SQL Server 2008, entonces no es necesario cambiar la propiedad de " replicate_ddl=1". Simplemente siga los pasos a continuación:

  1. SSMS abierto
  2. Conectarse a la base de datos del editor
  3. comando de ejecución ALTER TABLE [Table_Name] ALTER COLUMN [Column_Name] varchar(22)
  4. Se aumentará el ancho de columna de varchar(x)a varchar(22)y el mismo cambio que se puede ver en suscriptor (transacción consiguió replicado). Por lo tanto, no es necesario reiniciar la replicación

Espero que esto ayude a todos los que lo están buscando.


5

Ver este enlace

Cambiar el tamaño o modificar una columna de tabla de MS SQL Server con restricción predeterminada utilizando comandos T-SQL

la solución para tal problema de SQL Server será

Descartar o deshabilitar la restricción POR DEFECTO en la columna de la tabla.

Modificación del tipo de datos de columna de tabla y / o tamaño de datos.

Volver a crear o habilitar la restricción predeterminada en la columna de la tabla sql.

Adiós


y las vistas de enlace de esquema deben descartarse y volver a crearse.
nurettin

2

Esto es lo que funciona con la versión del programa que estoy usando: también puede funcionar para usted.

Simplemente colocaré las instrucciones y el comando que lo hace. clase es el nombre de la tabla. lo cambia en la tabla con este método. no solo el retorno del proceso de búsqueda.


ver la clase de tabla

select * from class

cambie la longitud de las columnas FacID (visto como "faci") y classnumber (visto como "classnu") para ajustarse a todas las etiquetas.

alter table class modify facid varchar (5);

alter table class modify classnumber varchar(11);

ver la tabla nuevamente para ver la diferencia

select * from class;

(ejecute el comando nuevamente para ver la diferencia)


Esto cambia la tabla real para bien, pero para mejor.

PD: hice estas instrucciones como una nota para los comandos. Esto no es una prueba, pero puede ayudar en una :)


0

Verifique la clasificación de columnas. Este script puede cambiar la clasificación a la tabla predeterminada. Agregue la clasificación actual al script.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.