为什么在使用get_ddl或describe时看不到过程中的所有代码?

问题描述 投票:0回答:3

这是我在这里发布的第一个问题,所以我希望格式可以接受。

我能够对所有存储过程执行 get_ddl() 和 DESC PROCEDURE,但有些存储过程在使用描述时具有 null

body
,并且在使用 get_ddl() 时被缩短。如果我与 SP 所有者的用户连接,它会向我显示整个过程。我还向模式中的 ETL 用户授予了过程的所有权限,但我仍然看不到所有代码。

这是在 SP 上运行 get_ddl() 的结果,它缺少 sql 命令变量以及之后的所有内容:

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

我可以使用非所有者的用户呼叫 SP,并且工作正常。帐户管理员角色也无法查看所有 SP 的完整过程。

有人可以帮我吗?

谢谢, 詹姆斯

stored-procedures snowflake-cloud-data-platform
3个回答
2
投票

这可能是因为Snowflake支持SP过载。您可能看到的是添加变量之前 SP 的早期副本。可能是不小心添加的,没有任何内容。例如:

-- Someone creates the shell of an SP like this:
create or replace procedure foo()
returns string
language javascript
as
$$
$$;

-- Later someone adds one or more variables and a body
create or replace procedure foo(MY_VARIABLE string)
returns string
language javascript
as
$$
    return "Hello world.";
$$;

-- Get the old signature, body is empty
select get_ddl('procedure', 'foo()');
describe procedure foo();

-- Get the newer signature, body has contents
select get_ddl('procedure', 'foo(string)');
describe procedure foo(string);

2
投票

我也遇到这个问题,搜索后发现是权限问题。 在snowflake

USAGE
权限中,不能读取程序体,只能读取名称和参数的定义。因此,授予您的用户读取权限,您将看到
GET_DDL()
命令、
DESC
过程、
SHOW
过程等中的内容。 您可以使用
SHOW GRANT TO USER USER_NAME
SHOW GRANT TO ROLE ROLE_NAME
查看您的许可。


0
投票

Snowflake 终于在今年早些时候解释了这个问题:https://community.snowflake.com/s/article/GET-DDL-funtion-returns-only-the-Sored-Procedure-definition

这是所有者权利存储过程设计的一部分。

如果您同意低权限用户调用该过程,则可以将其更改为调用者权限。然后任何拥有该程序使用权限的人都可以看到完整的正文内容。

如果您想将其限制为所有者的运行权限,则必须编写一个包装程序。文章中给出了说明和示例。

© www.soinside.com 2019 - 2024. All rights reserved.