我正在使用全局应用程序用户帐户访问数据库 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。我想直接从 select 语句中获取该DDL,以便我可以复制它,退出应用程序帐户,进入我的个人帐户,然后执行 DDL 以创建表。
这只是为了让我不必手动输入 DDL 以节省时间并减少输入错误,特别是因为源视图有这么多列。也就是说,我认为找 DBA 或编写一些时髦的存储过程来做动态的东西对于我的需求来说有点过头了。我认为必须有一种方法可以直接从 select 语句中获取用于创建表模式的 DDL。