2017-10-17 7 views
0

Dans SQL Server, existe-t-il un moyen rapide d'ajouter une contrainte à toutes les colonnes de toutes les tables d'une base de données vide?Ajouter une contrainte à toutes les colonnes de toutes les tables

Je souhaite ajouter des contraintes à toutes les colonnes pour empêcher les utilisateurs d'utiliser des espaces avant/arrière et des chaînes vides. Voici les contraintes que je veux ajouter: RIGHT([ColumnName],1) <> ' ' & & LEFT([ColumnName],1) <> ' ' & & ([ColumnName]<>'')

Je me rends compte que vous pouvez ajouter une seule contrainte à une colonne, mais que faites-vous si la base de données a beaucoup de tables avec même plus de colonnes, cela va prendre du temps pour ajouter des contraintes uniques à toutes les colonnes. Je cherche une solution plus efficace

+1

Juste une pensée qui passe ... Peut-être 'ascii (à droite ([ColumnName], 1))> 32' pour éviter les caractères de contrôle redoutés comme CRLF –

Répondre

2

Je ne vais pas plonger dans POURQUOI vous devez le faire sur chaque colonne dans DB, il semble étrange, mais je laisse cela à vous.

Voici comment vous le faites (vous ne l'avez pas spec quelle contrainte tho)

Faire une table temporaire sur toutes les tables colonnes de cette combinaison de table

  • itérer sur cette cueillette de table la 1ère

  • Définir votre contrainte en utilisant le tableau et le nom de la colonne, peut-être obtenir des choses supplémentaires aussi bien, dépend de ce que contraignent est

  • Après avoir ajouté la contrainte, supprimer cet enregistrement de la table temporaire si un autre devient supérieure 1.
  • continuer à le faire au-dessus de 2 balles jusqu'à ce que la table tassez est vide

Cela a été testé sur le serveur SQL, régler le code si vous avez besoin d'autres SGBD. Mais le principe est le même:

 select 
     o.name as Tab,c.name as Col 
    into #temp 
     from sys.columns   c 
      inner join sys.objects o on c.object_id=o.object_id 
     where type = 'U' -- only user defined 
       and (t.name = 'varchar' or t.name = 'nvarchar') -- only columns with this datatypes 
     order by o.name,c.column_id 

    -- select * from #temp 

    DECLARE @tab nvarchar(max) 
    DECLARE @col nvarchar(max) 

    while ((select count(*) from #temp) > 0) 
     BEGIN 
     set @tab = (select top 1 Tab from #temp) 
     set @col = (select top 1 Col from #temp) 
     -- add your constraint here 
     -- select @tab, @col 
     delete from #temp where Tab = @tab and Col = @col 
     END 

    drop table #temp 

Uncomment les parties pour voir les valeurs commentaires-colonne de table sélectionnée ou voir comment il itère.

EDIT 1: Ajout du where type = 'U' pour obtenir de system.objects seulement ceux définis par l'utilisateur.

EDIT 2: Élargissement de la clause where, maintenant il ne prend que des colonnes varchar et nvarchar de tables sur l'utilisateur

+2

Ce serait une bonne idée de mettre une clause where qui n'obtiendra que les champs varchar et nvarchar, et qui n'obtient pas non plus de tables système aussi – GuidoG

+0

Il a changé la question après avoir posté la réponse. Il explicite toutes les tables et n'indique pas les contraintes. – DanteTheSmith

+0

J'ai lu la question originale et mon commentaire est toujours présent. Il est inutile d'essayer d'éliminer les espaces dans d'autres types de champs, et certainement pas dans les tables et les vues système. Ne vous méprenez pas, je pense que votre réponse est bonne, il a juste besoin d'un réglage fin – GuidoG

0

Ce n'est pas une bonne idée d'ajouter ce type de contraintes partout dans la base de données. Je pense que les utilisateurs n'ajoutent pas directement les données à la base de données. Vous devez donc gérer cela dans la zone d'où les données sont ajoutées aux tables ou dans la couche de présentation.

+2

Les contraintes et les validations ne sont-elles pas mieux utilisées sur le back-end de la base de données? Si je ne l'ajoute pas à l'arrière, il y a une chance qu'un formulaire frontal "voyou" puisse glisser dans des chaînes vides. – Rhdr

+0

Je mets toujours autant sur la base de données que possible, puis de nouveau dans le frontal. Son double travail mais c'est le seul moyen d'être sûr – GuidoG

+0

Certainement vous pouvez utiliser des contraintes dans le backend et elles sont introduites car elles sont nécessaires et utiles.Mais j'ai parlé du type de contraintes que vous recherchez. Vous pouvez toujours appliquer des validations dans le frontal. Vous pouvez jeter un oeil sur les contraintes du serveur sql [ici] (https://technet.microsoft.com/fr-fr/library/ms189862 (v = sql.105) .aspx) –