首页 > 解决方案 > 雪花缺少 DDL 命令的定义

问题描述

我创建了一个用户和一个角色。

我授予数据库、模式和仓库的权限。也授予具有过程的模式。

但是,当我尝试通过 select get_ddl 命令获取过程 ddl 时,它会给出类似的结果。

CREATE OR REPLACE PROCEDURE "EMPLOYEE_INSERT"() RETURNS VARCHAR(16777216) LANGUAGE JAVASCRIPT EXECUTE AS OWNER AS '';

我没有得到过程定义。如果我得到任何帮助会很高兴。谢谢。

标签: snowflake-cloud-data-platform

解决方案


由于get_ddl返回任何东西,因此上下文中的角色很可能具有所需的授权。您看到这种情况的最可能原因是因为它返回了存储过程的重载——可能是一个较旧的存储过程,其中有人只创建了一个没有正文和参数的存根。

跑步show procedures in schema,或者如果你需要的那个没有出现,你可以上一层,然后show procedures in database

在返回中,检查“参数”列。当您运行时,请select get_ddl('procedure'...确保为感兴趣的重载指定参数。

例如,您可能会在“参数”列中看到如下内容:

FOO(VARCHAR, VARCHAR) RETURN VARCHAR

在这种情况下,要获取 SP 的主体,您将运行:

select get_ddl('procedure', 'FOO(VARCHAR, VARCHAR)');

关于这个的最后一个想法:get_ddl 将返回 SP 的主体,其中 AS 部分用单引号括起来。这意味着它必须将 SP 正文中各处的单引号加倍。如果原始的 create 语句不可用,这会使修改从 get_ddl 检索它的代码更加困难。我为这里的答案编写了一个存储过程,以将包装器和单个刻度更改为 $$: 如何使用 $$ 获取雪花存储过程 DDL


推荐阅读