グローバルアプリケーションのユーザーアカウントを使用してデータベースAにアクセスしています。このユーザーアカウントには、データベースAのスキーマを変更する権限がありません(つまり、テーブルの作成、テーブルの変更など)。このユーザーはデータベースBにもアクセスできますが、ビューのみです。SQLを実行して、データベースBのビューからデータベースAのテーブルにデータをフィードする必要があります。
完璧な世界では、次のSQLを使用できます。
create database_a.mytable as (select * from database_b) with no data
ただし、ユーザーはデータベースAにテーブルを作成できません。selectステートメントのDDLを取得できれば、個人アカウント(データベースBにアクセスできない)でログインし、データベースでDDLを実行できます。テーブルを作成するためのA。
他の唯一のオプションはSQLを手動で作成することですが、特にコピーしたいこのビューにはさまざまなデータ型とサイズの列が多数あるため、これは行いたくありません。
編集:私は近づいているかもしれません。私はこれを試しました:
show (select * from database_b.myview)
ただし、ビュー自体で使用されるすべてのテーブルのDLLと、ビューの定義が生成されました。selectステートメント自体のスキーマが必要なだけなので、これは実際には役に立ちません。create table as
つまり、上記のステートメントを使用した場合に生成されるものが必要です。
Robのために編集:おそらく「DDL」は使用するのに間違った用語でした。を使用show view db.myview
すると、ビューが表すスキーマではなく、ビューの定義が表示されます。上記のの例ではcreate table as
、selectで返される結果セットのスキーマを模倣するテーブルを作成する方法を示しています。テーブルを作成するためにバックエンドでDDLを生成し、そのDDLを実行して実際にテーブルを作成します。show table db.newtable
次に、新しいテーブルのDDLを言って確認できます。そのDDLをselectステートメントから直接取得して、コピーし、アプリアカウントからログアウトして個人アカウントにログインし、DDLを実行してテーブルを作成できるようにします。
これは、特にソースビューに非常に多くの列があるため、時間を節約し、入力エラーを減らすために、手動でDDLを入力する必要があるという頭痛の種を節約するためだけのものです。とは言うものの、DBAを起動したり、動的な処理を実行するための洗練されたストアドプロシージャを作成したりすることは、私のニーズにとっては少しやり過ぎだと思います。selectステートメントから直接テーブルスキーマを作成するためのDDLを取得する方法が必要だと思います。