Teradata: Est-il un moyen de générer de DDL à partir d'une vue ou d'une instruction select?
Je suis à l'aide d'une application globale de compte d'utilisateur pour accéder à la base de données A. Ce compte d'utilisateur n'a pas les autorisations pour modifier la base de données du schéma (c'est à dire, créer des tables, modifier des tables, etc). Cet utilisateur a également accès à la base de données B, mais seulement des points de vue. J'ai besoin d'exécuter SQL pour flux de données à partir d'une vue de la base de données B dans une table de la base de données A.
Dans un monde parfait, je serais en mesure d'utiliser cette SQL:
create database_a.mytable as (select * from database_b) with no data
Cependant, l'utilisateur ne peut pas créer des tables dans la base de données A. Si je pouvais obtenir le DDL de l'instruction select puis, j'ai pu connecter sous mon compte personnel (qui n'ont pas accès à la base de données B) et exécutez le DDL dans Une base de données pour créer la table.
La seule autre option est d'écrire manuellement le SQL, mais je ne veux pas le faire, surtout depuis ce point de vue, je suis désireux de copie a beaucoup de colonnes de divers types de données et de tailles.
Edit: j'ai peut-être se rapprocher. Je viens expérimenté ce:
show (select * from database_b.myview)
Cependant, il a généré la DLL de chaque table qui est utilisée dans la vue elle-même, ainsi que la définition de la vue. Ce n'est pas vraiment m'aider car je veux juste le schéma de l'instruction select. En d'autres termes, j'ai besoin de ce que pourrait être générée si je devais utiliser le create table as
déclaration mentionnée ci-dessus.
Modifier pour Rob: peut-être de "DDL" était pas le bon terme à utiliser. À l'aide de show view db.myview
montre juste la définition de la vue, de ne pas le schéma qu'il représente. Dans mon exemple ci-dessus de create table as
, je montre comment vous pouvez créer un tableau qui reproduit le schéma d'un ensemble de résultats retournés dans un select. Elle génère le DDL sur le back-end pour la création d'une table, puis l'exécute DDL pour créer le tableau. Vous pouvez ensuite dire show table db.newtable
et de voir la nouvelle table DDL. Je veux obtenir que DDL directement à partir d'une instruction select pour que je puisse le copier, le journal de l'app compte, dans mon compte personnel, puis d'exécuter le script DDL pour créer la table.
Ce n'est que pour m'épargner les maux de tête d'avoir à taper le DDL manuellement en main pour gagner du temps et de réduire les erreurs de frappe, surtout depuis la vue de la source a donc de nombreuses colonnes. Cela dit, je pense que de frapper le DBA ou l'écriture de certains snazzy procédure stockée pour faire dynamique choses devraient être un peu plus haut pour mes besoins. Je pense qu'il doit y avoir moyen de le DDL pour la création d'un schéma de table directement à partir d'une instruction select.
OriginalL'auteur oscilatingcretin | 2012-10-16
Vous devez vous connecter pour publier un commentaire.
Générer des Instructions DDL pour les objets:
De rupture de colonnes dans une vue:
Cependant, sans cette capacité à créer l'objet dans la base de données cible
DatabaseA
votre n'ont pas beaucoup d'effet de levier. Évidemment, si l'objet existe déjàINSERT INTO SELECT ... FROM DatabaseB.Table1
ouMERGE INTO
serait options que vous avez déjà exploré.Solution Alternative
Serait-il possible d'avoir une procédure stockée créé dynamiquement créé la table basée sur le nom de la vue qui vous est fourni? L'application à l'échelle mondiale compte serait tout simplement besoin de privilèges pour exécuter la procédure. Généralement, l'utilisateur de la création de la procédure stockée aurait besoin de l'autorisation d'effectuer les actions contenues dans la procédure stockée. (Vous avez une flexibilité supplémentaire dans cette Teradata 13.10.)
Il y a quelques mises en garde avec cette approche. Vous essayez de matérialiser les points de vue qui pourraient référence de n'importe où à partir de centaines de milliards d'enregistrements. Ce ne sont pas des simple 1:1 points de vue qui sont mis sur le dessus de la table cible. En essayant de déterminer l'espace requis dans la base de données cible pour matérialiser le point de vue sera difficile. Les performances varient et peuvent varier en fonction de la complexité de la vue et les volumes de données. Ce ne sera pas un fast-path ou le bloc de données de fonctionnement optimal.
En tant qu'administrateur, je serais inquiet de cette approche par une application à l'échelle mondiale compte sans pleinement comprendre l'intention. J'espère que vous avez une ligne de communication ouverte avec le DBA(s) pour le soutien de ce système. Je suis sûr qu'il ya des raisons pour ta folie qui ne peuvent pas être divulgués ici.
Solution Possible VOLATILE TABLE
À moins que l'implicite privilège pour CRÉER la TABLE a été révoqué de l'application à l'échelle mondiale compte cette solution devrait fonctionner.
Volatils tables ne nécessitent pas de perm de l'espace. Il y a les définitions de table persistent pendant toute la durée de la session, et les données insérées dans repose sur la bobine de l'espace de l'utilisateur qui instancié.
J'ai opté pour l'utilisation d'un Teradata 13.10 fonctionnalité appelée
NO PRIMARY INDEX
. Par défaut,CREATE TABLE
COMME nous allons prendre la première colonne de laSELECT
déclaration et d'en faire laPRIMARY INDEX
de la table. Cela pourrait conduire à l'inclinaison et perm problèmes d'espace dans votre test en fonction des données démographiques. Vous pouvez spécifier explicitementPRIMARY INDEX
sur votre propre que vous comprenez les données sous-jacentes. (Voir le DDL manuels pour plus de détails sur la syntaxe si vous êtes incertain.)L'utilisation de
ON COMMIT PRESERVE ROWS
pour le but de cet exemple est sans doute superflu. Mais en réalité, si vous avez sauté toutes les données dans cette table pour les tests de cette clause serait bénéfique dans Teradata mode que les données seraient perdues immédiatement après laCREATE TABLE
ou toute autre manipulation de données a été effectuée par rapport à la volatilité de la table.Ajouté deuxième solution potentielle. Je pense que l'approche de procédure stockée est trop lourd à la lumière de la nouvelle solution.
Incroyable! Il a parfaitement fonctionné. Je dois modifier un peu les DDL, mais vous n'avez aucune idée de combien de temps cela va me sauver. Bien sûr, j'aurais pu le faire 30 fois dans le temps il m'a fallu pour poster ma question et obtenir la réponse, mais c'est resusable pour l'avenir. Merci!
OriginalL'auteur Rob Paller