2013-06-13 2 views
0

je dois mettre une contrainte sur toutes les colonnes numériques, voici ce que j'ai essayé: Tout doit être possitivecontrainte sur toutes les tables numériques

ALTER TABLE * ADD CONSTRAINT Checknumbers CHECK (> 0) 

Ce ne fonctionne pas, mais je ne peux pas trouver un solution pour cela.

Est-ce que leur autre syntaxe est que je peux utiliser ou dois-je faire manuellement pour chaque table?

+0

Il n'y a pas de syntaxe générale dans SQL pour appliquer une contrainte à plusieurs tables. Il peut y avoir un produit spécifique mais vous n'avez pas inclus de balise pour nous indiquer les SGBDR que vous utilisez. –

+0

J'utilise Oracle - Apex – user2252399

+0

J'ai ajouté quelques tags pour cela. –

Répondre

4

Vous devez créer une contrainte distincte pour chaque colonne de chaque table. Vous pourriez éventuellement écrire un peu de SQL dynamique pour cette

DECLARE 
    l_sql_stmt VARCHAR2(1000); 
BEGIN 
    FOR x IN (SELECT * 
       FROM user_tab_columns 
      WHERE data_type = 'NUMBER' 
       AND table_name in (SELECT table_name 
            FROM user_tables 
            WHERE dropped = 'NO') 
    LOOP 
    l_sql_stmt := 'ALTER TABLE ' || x.table_name || 
        ' ADD CONSTRAINT chk_' || x.table_name || '_' || x.column_name || 
        ' CHECK(' || x.column_name || ' > 0)'; 
    EXECUTE IMMEDIATE l_sql_stmt; 
    END LOOP; 
END; 

Pour chaque colonne numérique dans toutes les tables dans le schéma actuel, il tente de créer une contrainte de vérification. Le nom de la contrainte est limité à 30 caractères, donc si la somme de la longueur du nom de la table et du nom de la colonne est supérieure à 25, cela tentera de générer un identifiant invalide. Vous auriez besoin de trouver une autre façon de générer le nom de la contrainte (ou vous pourriez laisser le système générer un nom). Cela ne gérera pas non plus les identifiants sensibles à la casse si vous en possédez. Vous auriez besoin de double-citer les identifiants si c'est un problème pour vous.

+3

Vous ne savez pas si les tables qui se trouvent dans la corbeille ont toujours une entrée dans user_tab_columns, mais cela pourrait valoir la peine de vérifier. DROPPED = 'NO' –

+0

@DavidAldridge - Bonne idée. Ajouté ça –

Questions connexes