【发布时间】:2012-10-06 13:47:30
【问题描述】:
我正在使用全局应用程序用户帐户访问数据库 A。此用户帐户无权修改数据库 A 的架构(即创建表、修改表等)。该用户还可以访问数据库 B,但只能查看。我需要运行 SQL 以将数据库 B 中的视图中的数据馈送到数据库 A 中的表中。
在一个完美的世界里,我可以使用这个 SQL:
create database_a.mytable as (select * from database_b) with no data
但是,用户不能在数据库 A 中创建表。如果我可以获取 select 语句的 DDL,那么我可以在我的个人帐户(没有任何访问数据库 B 的权限)下登录并运行数据库A中的DDL来创建表。
唯一的其他选择是手动编写 SQL,但我不想这样做,特别是因为我要复制的这个视图有许多不同数据类型和大小的列。
编辑:我可能越来越近了。我只是对此进行了实验:
show (select * from database_b.myview)
但是,它生成了视图本身中使用的每个表的 DLL,以及视图的定义。这并没有真正帮助我,因为我只想要 select 语句本身的模式。换句话说,如果我要使用上面提到的create table as 语句,我需要生成什么。
为 Rob 编辑:也许“DDL”这个词用错了。使用show view db.myview 只显示视图的定义,而不是它所代表的模式。在上面的create table as 示例中,我展示了如何创建一个表来模拟选择中返回的结果集的模式。它在后端生成一个用于创建表的 DDL,然后执行该 DDL 以实际创建表。然后您可以说show table db.newtable 并查看新表的 DDL。我想直接从 select 语句中获取 那个 DDL,以便我可以复制它,退出应用程序帐户,进入我的个人帐户,然后执行 DDL 以创建表。
这只是为了让我不必手动输入 DDL 以节省时间并减少输入错误,特别是因为源视图有这么多列。也就是说,我认为找 DBA 或编写一些时髦的存储过程来做动态的东西对于我的需求来说有点过头了。我认为必须有一种方法可以直接从 select 语句中获取用于创建表模式的 DDL。
【问题讨论】:
标签: teradata