web-dev-qa-db-fra.com

Modification des types de table définis par l'utilisateur dans SQL Server

Comment modifier un type de table défini par l'utilisateur dans SQL Server?

70
yogi

A ma connaissance, il est impossible de modifier/modifier un type de table.Vous pouvez créer le type avec un nom différent, puis supprimer l'ancien type et le modifier pour le nouveau nom.

Crédits à jkrajes

Selon msdn , cela ressemble à "La définition du type de table définie par l'utilisateur ne peut pas être modifiée après sa création".

63

C'est un peu un bidouillage, mais semble fonctionner. Vous trouverez ci-dessous les étapes et un exemple de modification d’un type de table. Une remarque est que sp_refreshsqlmodule échouera si la modification apportée au type de table est une modification radicale de cet objet, généralement une procédure.

  1. Utilisation sp_rename _ pour renommer le type de table, j’ajoute généralement z au début du nom.
  2. Créez un nouveau type de table avec le nom d'origine et toute modification que vous devez apporter au type de table.
  3. Parcourez chaque dépendance et exécutez sp_refreshsqlmodule dessus.
  4. Supprimez le type de table renommé.

EXEC sys.sp_rename 'dbo.MyTableType', 'zMyTableType';
GO
CREATE TYPE dbo.MyTableType AS TABLE(
    Id INT NOT NULL,
    Name VARCHAR(255) NOT NULL
);
GO
DECLARE @Name NVARCHAR(776);

DECLARE REF_CURSOR CURSOR FOR
SELECT referencing_schema_name + '.' + referencing_entity_name
FROM sys.dm_sql_referencing_entities('dbo.MyTableType', 'TYPE');

OPEN REF_CURSOR;

FETCH NEXT FROM REF_CURSOR INTO @Name;
WHILE (@@FETCH_STATUS = 0)
BEGIN
    EXEC sys.sp_refreshsqlmodule @name = @Name;
    FETCH NEXT FROM REF_CURSOR INTO @Name;
END;

CLOSE REF_CURSOR;
DEALLOCATE REF_CURSOR;
GO
DROP TYPE dbo.zMyTableType;
GO

ATTENTION:

Cela peut être destructeur pour votre base de données, vous devrez donc commencer par le tester sur un environnement de développement.

33
norlando

Voici des étapes simples qui minimisent l’ennui et ne nécessitent pas de scripts semi-automatisés ou d’outils coûteux.

N'oubliez pas que vous pouvez générer des instructions DROP/CREATE pour plusieurs objets à partir de la fenêtre Détails de l'explorateur d'objets (les scripts DROP et CREATE sont ainsi regroupés, ce qui facilite l'insertion de logique entre les actions Drop et Create):

Drop and Create To

  1. Sauvegardez votre base de données en cas de problème!
  2. Générez automatiquement les instructions DROP/CREATE pour toutes les dépendances (ou générez tous les objets "Programmabilité" pour éliminer l’ennui de la recherche de dépendances).
  3. Entre les instructions DROP et CREATE [dépendances] (après tout DROP, avant tout CREATE), insérez les instructions DROP/CREATE [type de table] générées, en apportant les modifications nécessaires avec CREATE TYPE.
  4. Exécutez le script, qui supprime toutes les dépendances/UDTT, puis recrée les [UDTT avec modifications]/les dépendances.

Si vous avez des projets plus petits où il peut être judicieux de modifier l'architecture de l'infrastructure, envisagez d'éliminer les types de table définis par l'utilisateur. Entity Framework et des outils similaires vous permettent de déplacer la plupart, sinon la totalité, de votre logique de données vers votre base de code, où il est plus facile à gérer.

12
Andre Light

Si vous pouvez utiliser un projet de base de données dans Visual Studio, vous pouvez y apporter vos modifications et utiliser une comparaison de schéma pour synchroniser les modifications apportées à votre base de données.

De cette façon, la suppression et la recréation des objets dépendants sont gérées par le script de modification.

5
Simon Zeinstra

vous ne pouvez pas modifier/modifier votre type. Vous devez supprimer l'existant et le recréer avec le nom/type de données correct ou ajouter une nouvelle colonne/s

3
user2767892

Simon Zeinstra a trouvé la solution!

Cependant, j'ai utilisé la communauté Visual Studio 2015 et je n'ai même pas eu besoin d'utiliser la comparaison de schéma.

À l'aide de l'explorateur d'objets SQL Server, j'ai trouvé mon type de table défini par l'utilisateur dans la base de données. J'ai cliqué avec le bouton droit sur le type de table et sélectionné. Cela a ouvert un onglet de code dans IDE avec le code TSQL visible et éditable. J'ai simplement changé la définition (dans mon cas, la taille d'un champ nvarchar a été augmentée) et cliqué sur le bouton Mettre à jour la base de données en haut à gauche de l'onglet.

Hé Presto! - une vérification rapide dans SSMS et la définition de udtt a été modifiée.

Génial - merci Simon.

3
BioEcoSS

Vous devez supprimer l'ancien type de table et en créer un nouveau. Cependant, s'il existe des dépendances (toutes les procédures stockées l'utilisant), vous ne pourrez pas le supprimer. J'ai posté une autre réponse sur la façon d'automatiser le processus de suppression temporaire de toutes les procédures stockées, de modification de la table, puis de restauration des procédures stockées.

3
BornToCode