1
votes

Impossible de trouver les noms de colonne dans une contrainte FK

J'ai créé deux tables dans Snowflake.

create or replace TRANSIENT TABLE TESTPARENT (
COL1 NUMBER(38,0) NOT NULL,
COL2 VARCHAR(16777216) NOT NULL,
COL3 VARCHAR(16777216) NOT NULL,
constraint UNIQ_COL3 unique (COL3)
);


create or replace TRANSIENT TABLE TESTCHILD3 (
COL_A NUMBER(38,0) NOT NULL,
COL_B NUMBER(38,0) NOT NULL,
ABCDEF VARCHAR(16777216) NOT NULL,
constraint FKEY_1 foreign key (COL_A, COL_B) references TEST_DB.PUBLIC.TESTPARENT1(COL1,COL2),
constraint FKEY_2 foreign key (ABCDEF) references TEST_DB.PUBLIC.TESTPARENT(COL3)
);

Je souhaite maintenant exécuter une requête et voir les noms des colonnes impliquées dans FKEY_2 FOREIGN KEY dans la table TESTCHILD3 , mais il semble qu'il n'y ait pas de table / vue de base de données qui conserve ces informations. Je peux trouver les noms de colonne pour UNIQUE KEY & PRIMARY KEY mais il n'y a rien pour FOREIGN KEYS .

EDIT J'ai déjà essayé INFORMATION_SCHEMA.TABLE_CONSTRAINTS , ainsi que INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS et toutes les autres tables système. Pas de chance. Seul DESC TABLE me donne des informations relatives aux CONSTRAINTS et COLUMNS , mais il manque également des informations FOREIGN KEY CONSTRAINTS .


0 commentaires

3 Réponses :


0
votes

Vous pouvez peut-être essayer d'interroger cette vue: INFORMATION_SCHEMA.TABLE_CONSTRAINTS

Remarque: TABLE_CONSTRAINTS n'affiche que les objets pour lesquels le rôle actuel de la session a reçu des privilèges d'accès.

Pour en savoir plus, consultez: https: //docs.snowflake .net / manual / sql-reference / info-schema / table_constraints.html


1 commentaires

Merci, mais j'ai déjà essayé cela, avec INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS et toutes les autres tables système. Pas de chance. Seul DESC TABLE me donne des informations relatives aux contraintes et aux colonnes, mais il manque également des informations sur les contraintes FK.



1
votes

Réponse mise à jour:

J'étais en train de vérifier quelque chose sans rapport et j'ai remarqué un moyen très efficace de lister toutes les clés primaires et étrangères:

show exported keys in table "DB_NAME"."SCHEMA_NAME"."PARENT_TABLE";

Lorsque vous limitez l'appel à une table, il semble que vous deviez demander les clés étrangères qui pointent vers la table parente:

show exported keys in account; -- Foreign keys
show primary keys in account;

Vous pouvez consulter la documentation pour savoir comment limiter la commande show à une base de données spécifique ou schéma, mais cela renvoie très rapidement des informations riches dans un tableau.


2 commentaires

Merci, oui si vous exécutez SELECT GET_DDL ('Table', 'table_name') alors cela donnerait le DDL qui contiendra le FK et tout le reste. Cela marcherait. Mais ma nécessité est différente, j'ajoute la prise en charge de Snowflake Data Warehouse dans un modeleur de données, où j'ai besoin de tout faire de l'ingénierie inverse dans un modèle de données. Je peux continuer et utiliser le DDL pour l'analyser et créer le modèle, mais le DDL peut changer avec le temps avec les nouvelles versions et l'analyseur peut cesser de fonctionner après un certain temps.


Je t'ai eu. J'ai en fait écrit quelque chose qui parcourra chaque table et rapportera les FK, mais en raison de la complexité, je l'ai écrit en Java. Je peux revoir l'écriture dans un SP à un moment donné. Un de mes clients a pris le code que j'ai écrit dans le JAR et a fait quelques légères modifications à utiliser avec ses outils de modélisation. Si cela vous est utile, vous pouvez trouver le fichier JAR et la source Java ici: snowflake.pavlik.us/index.php/2020/01/12/...



0
votes

AFFICHER LES CLÉS IMPORTÉES DANS LA TABLE ;


0 commentaires