Stored procedures 为什么可以';当使用get_ddl或Descripte时,我看不到过程中的所有代码吗?

Stored procedures 为什么可以';当使用get_ddl或Descripte时,我看不到过程中的所有代码吗?,stored-procedures,snowflake-cloud-data-platform,Stored Procedures,Snowflake Cloud Data Platform,这是我在这里发布的第一个问题,所以我希望格式可以接受 我能够为所有存储过程执行get_ddl()和DESC过程,但有些存储过程在使用descripe时有空的主体,在使用get_ddl()时被截断。如果我与SP所有者的用户进行连接,它会显示整个过程。我还向模式中的ETL用户授予了过程的所有权限,但仍然看不到所有代码 这是在SP上运行get_ddl()的结果,它缺少sql命令变量以及以下所有内容: CREATE OR REPLACE PROCEDURE "SP_test"() R

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

我能够为所有存储过程执行get_ddl()和DESC过程,但有些存储过程在使用descripe时有空的
主体
,在使用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工作正常。帐户管理员角色也无法查看所有SP的完整过程

有人能帮我一下吗

谢谢,
James

这可能是因为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);

我确实发现,您可以在模式上执行get_ddl(),它为您提供了所有对象(表、过程…)的create语句,这是另一个解决方法。感谢Greg有趣的观点。据我所知,在此架构中,我关心的SP只有一个同名SP。它不需要变量。它可能会在另一个架构上重载,但似乎不太可能,因为GET_DDL()在运行时需要dw、架构和变量。只是想一想:您看不到其主体的SP是否引用用户没有权限的任何对象?