Modification de la taille d'une colonne référencée par une vue liée au schéma dans SQL Server

124

J'essaie de changer la taille d'une colonne dans le serveur SQL en utilisant:

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

où la longueur de Addr1était à l'origine40 .

Il a échoué, soulevant cette erreur:

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

J'ai essayé de lire dessus et il semble que parce que certaines vues font référence à cette colonne et il semble que SQL Server essaie en fait de supprimer la colonne qui a soulevé l'erreur.

Address_e est une vue créée par l'ancien administrateur de base de données.

Existe-t-il un autre moyen de modifier la taille de la colonne?

Staelen
la source
2
Address_e est une vue créée par l'ancien administrateur de base de données. Et comme ce que Remus a mentionné, il a défini SCHEMABINDING.
Staelen

Réponses:

58

Les vues sont probablement créées à l'aide de l'option WITH SCHEMABINDING et cela signifie qu'elles sont explicitement câblées pour empêcher de telles modifications. On dirait que le schemabinding a fonctionné et vous a empêché de casser ces vues, jour de chance, hein? Contactez votre administrateur de base de données et demandez-lui de faire le changement, après qu'il ait affirmé l'impact sur la base de données.

Depuis MSDN :

PLANIFICATION

Lie la vue au schéma de la ou des tables sous-jacentes. Lorsque SCHEMABINDING est spécifié, la ou les tables de base ne peuvent pas être modifiées d'une manière qui affecterait la définition de la vue. La définition de vue elle-même doit d'abord être modifiée ou supprimée pour supprimer les dépendances sur la table à modifier.

Remus Rusanu
la source
1
merci Remus, la vue a défini SCHEMABINDING. existe-t-il un moyen simple de contourner la contrainte ou dois-je vraiment supprimer les vues pour le faire fonctionner?
Staelen
1
Vous ne pouvez pas le contourner, c'est tout son objectif. Quelqu'un est allé plus loin pour ajouter le schemabindig pour empêcher les changements de table. Ce n'est pas un accident, on dirait que la personne sait ce qu'elle faisait. Êtes-vous sûr de vouloir modifier le tableau?
Remus Rusanu
1
oui, je suis sûr =) et logiquement (même si je sais que cela ne fonctionne pas de cette façon) j'augmente la longueur de la colonne, ce qui ne devrait vraiment convenir que si la colonne n'est pas supprimée et recréée, mais malheureusement ce n'est pas le cas ... mais merci pour votre aide! = D
Staelen
2
Je vois le même problème et malheureusement nous utilisons les vues SCHEMABINDING afin d'indexer les vues. Donc, dans mon cas, je n'utilise pas SCHEMABINDING pour bloquer explicitement les modifications apportées aux tables sous-jacentes, mais uniquement pour se conformer aux exigences de SQL Server pour utiliser des vues indexées. Je voudrais également contourner cela sans abandonner et recréer mes vues.
jpierson
256
ALTER TABLE [table_name] ALTER COLUMN [column_name] varchar(150)
Syed Baqar Hassan
la source
11
non, le problème était comme ce que Remus avait mentionné. il n'y a rien de mal avec le code lui
Staelen
11
@NilRad Ummm, vous pensez peut-être à PL-SQL? ALTER COLUMN est la syntaxe correcte sur SQL 2008 R2
schmidlop
4
Est-ce que je manque quelque chose? Pourquoi tant de votes positifs? Cela ne répond pas à la question.
Andy Wiesendanger
13
Le nombre de votes à la hausse peut être dû au fait que cette question est actuellement le meilleur hit de Google pour `` tsql alter nvarchar length '' et donc aux personnes (comme moi) qui veulent juste qu'on leur rappelle comment modifier la longueur d'une colonne voir cette réponse et plus -votez pour dire «merci» sans remarquer (comme je ne l'ai fait qu'après avoir lu votre commentaire) que la question est plus subtile que le titre de la question ne le suggère.
dumbledad
6

Si quelqu'un souhaite «augmenter la largeur de colonne de la table répliquée» dans SQL Server 2008, il n'est pas nécessaire de modifier la propriété de « replicate_ddl=1». Suivez simplement les étapes ci-dessous -

  1. Ouvrez SSMS
  2. Se connecter à la base de données Publisher
  3. exécuter la commande - ALTER TABLE [Table_Name] ALTER COLUMN [Column_Name] varchar(22)
  4. Cela augmentera la largeur de la colonne de varchar(x)à varchar(22)et le même changement que vous pouvez voir sur l'abonné (la transaction a été répliquée). Donc pas besoin de réinitialiser la réplication

J'espère que cela aidera tous ceux qui le recherchent.

Devshish
la source
5

Voir ce lien

Redimensionner ou modifier une colonne de table MS SQL Server avec une contrainte par défaut à l'aide des commandes T-SQL

la solution à un tel problème SQL Server va être

Suppression ou désactivation de la contrainte DEFAULT sur la colonne de table.

Modification du type de données de la colonne de table et / ou de la taille des données.

Recréer ou réactiver la contrainte par défaut sur la colonne de la table sql.

Au revoir

RRUZ
la source
et les vues de liaison de schéma doivent être supprimées et recréées.
nurettin
2

voici ce qui fonctionne avec la version du programme que j'utilise: peut fonctionner pour vous aussi.

Je vais juste placer l'instruction et la commande qui le font. class est le nom de la table. vous le changez dans le tableau lui-même avec cette méthode. pas seulement le retour sur le processus de recherche.


voir la classe de table

select * from class

changer la longueur des colonnes FacID (vu comme "faci") et classnumber (vu comme "classnu") pour s'adapter à l'ensemble des étiquettes.

alter table class modify facid varchar (5);

alter table class modify classnumber varchar(11);

voir à nouveau le tableau pour voir la différence

select * from class;

(réexécutez la commande pour voir la différence)


Cela change la table réelle pour de bon, mais pour mieux.

PS J'ai fait ces instructions comme une note pour les commandes. Ce n'est pas un test, mais cela peut vous aider :)

Passingn Searcher
la source
0

Vérifiez le classement des colonnes. Ce script peut modifier le classement par défaut de la table. Ajoutez le classement actuel au script.

user3103989
la source