gpt4 book ai didi

Teradata:有没有办法从 View 或选择语句生成 DDL?

转载 作者:行者123 更新时间:2023-12-04 17:11:10 25 4
gpt4 key购买 nike

我正在使用全局应用程序用户帐户访问数据库 A。此用户帐户无权修改数据库 A 的架构(即创建表、修改表等)。该用户还可以访问数据库 B,但只能访问 View 。我需要运行 SQL 将数据从数据库 B 中的 View 提供到数据库 A 中的表中。

在一个完美的世界中,我将能够使用这个 SQL:
create database_a.mytable as (select * from database_b) with no data
但是,用户无法在数据库 A 中创建表。 如果我可以获取 select 语句的 DDL,那么我可以在我的个人帐户下登录(该帐户对数据库 B 没有任何访问权限)并在数据库中运行 DDL A 创建表。

唯一的另一种选择是手动编写 SQL,但我不想这样做,尤其是因为我要复制的这个 View 具有许多不同数据类型和大小的列。

编辑:我可能越来越近了。我刚刚尝试了这个:
show (select * from database_b.myview)
但是,它生成了 View 本身中使用的每个表的 DLL,以及 View 的定义。这并没有真正帮助我,因为我只想要 select 语句本身的模式。换句话说,如果我要使用 create table as,我需要生成什么。上面提到的声明。

为 Rob 编辑:也许“DDL”是错误的使用术语。使用 show view db.myview只显示 View 的定义,而不是它代表的模式。在我上面的 create table as 示例中,我将展示如何创建一个表来模拟选择中返回的结果集的架构。它在后端生成一个用于创建表的 DDL,然后执行该 DDL 以实际创建表。然后你可以说 show table db.newtable并查看新表的 DDL。我想直接从 select 语句中获取该 DDL,以便我可以复制它,注销应用程序帐户,进入我的个人帐户,然后执行 DDL 以创建表。

这只是为了避免我不得不手动输入 DDL 以节省时间并减少输入错误的麻烦,特别是因为源 View 有这么多列。也就是说,我认为联系 DBA 或编写一些时髦的存储过程来执行动态操作对于我的需求来说有点过头了。我认为必须有一种方法可以直接从 select 语句中获取用于创建表模式的 DDL。

最佳答案

为对象生成 DDL 语句:

SHOW TABLE {DatabaseB}.{Table1};
SHOW VIEW {DatabaseB}.{View1};

View 中的列分割:
HELP VIEW {DatabaseB}.{View1};

但是,无法在目标数据库中创建对象 DatabaseA你没有太多的筹码。显然,如果对象已经存在 INSERT INTO SELECT ... FROM DatabaseB.Table1MERGE INTO将是您已经探索过的选项。

替代方案

是否可以创建一个存储过程,根据提供的 View 名称动态创建表?全局应用程序帐户只需要特权即可执行该过程。通常,创建存储过程的用户需要执行存储过程中包含的操作的权限。 (在 Teradata 13.10 中,您有一些额外的灵活性。)

这种方法有一些注意事项。您正在尝试具体化可以引用数百到数十亿条记录的 View 。这些不是放在目标表顶部的简单的 1:1 View 。尝试确定目标数据库中实现 View 所需的空间将很困难。性能可以并且将会根据 View 的复杂性和数据量而变化。这不是快速路径或数据块优化操作。

作为一名 DBA,我会担心全局应用程序帐户在没有完全理解意图的情况下采用这种方法。我相信您与支持该系统的 DBA 之间有着开放的沟通 channel 。我敢肯定,你的疯狂是有原因的,这里不能透露。

可能的解决方案 - volatile 表

除非已从全局应用程序帐户撤销 CREATE TABLE 的隐式权限,否则此解决方案应该有效。

volatile 表不需要永久空间。表定义在 session 期间持续存在,插入其中的任何数据都依赖于实例化它的用户的假脱机空间。
CREATE VOLATILE TABLE {Global Application UserID}.{TableA_Copy} AS 
(
SELECT *
FROM {DatabaseB}.{TableA}
)
WITH NO DATA
NO PRIMARY INDEX
ON COMMIT PRESERVE ROWS;

SHOW TABLE {Global Application UserID}.{TableA_Copy};

我选择使用名为 NO PRIMARY INDEX 的 Teradata 13.10 功能.默认情况下, CREATE TABLE AS 将取 SELECT 的第一列声明并将其设为 PRIMARY INDEX表的。这可能会导致测试中出现倾斜和永久空间问题,具体取决于数据人口统计。您可以指定显式 PRIMARY INDEX当您了解基础数据时,请自行决定。 (如果不确定,请参阅 DDL 手册以获取有关语法的详细信息。)
ON COMMIT PRESERVE ROWS的使用对于这个例子的意图可能是无关紧要的。但实际上,如果您将任何数据弹出到该表中以测试此子句在 Teradata 模式下将是有益的,否则数据将在 CREATE TABLE 之后立即丢失。或对 volatile 表执行任何其他数据操作。

关于Teradata:有没有办法从 View 或选择语句生成 DDL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12915067/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com