【问题标题】:Snowflake - Get the schema owner of the currently executing stored procedureSnowflake - 获取当前正在执行的存储过程的架构所有者
【发布时间】:2021-05-19 13:38:42
【问题描述】:

有没有办法从执行过程中获取存储过程的所有者架构?例如,我将程序声明为:

CREATE PROCEDURE UTIL.P_TEST()
EXECUTE AS CALLER

当我从不同的架构“NOT_UTIL”中执行该过程时:

USE NOT_UTIL;
CALL UTIL.P_TEST();

如果我使用 CURRENT_SCHEMA() 函数,我将获得当前会话“NOT_UTIL”的架构名称(如预期的那样),我需要的是获得该过程的所有者架构:UTIL。

在 TSQL 中,我们可以使用以下语法获取架构:

OBJECT_SCHEMA_NAME(@@PROCID)

有没有办法从雪花程序中获取这个值?请注意,对于此用例,使用“EXECUTE AS OWNER”选项不是可行的解决方案。

【问题讨论】:

    标签: snowflake-cloud-data-platform procedure


    【解决方案1】:

    SET CATALOG =(SELECT PROCEDURE_CATALOG FROM SNOWFLAKE.INFORMATION_SCHEMA.PROCEDURES WHERE PROCEDURE_NAME LIKE '%NAME%');

    【讨论】:

    • 感谢您的反馈,但这无济于事。首先,您的查询返回过程所在的数据库名称,而不是模式(正确的列是 PROCEDURE_SCHEMA);其次,如果多个模式中有同名的过程,这将返回所有过程,而不是正在执行的过程。
    【解决方案2】:

    CURRENT_SCHEMA() 将返回您要查找的值,只要该过程具有 execute as owner(默认值)。

    否则execute as caller 它只知道调用者的架构。

    你没有在问题中指定你没有使用默认的execute as env,所以我假设你这样做了,并且期望的结果正是你想要的。

    测试:

    create schema temp2;
    use schema temp.public;
    
    CREATE OR REPLACE PROCEDURE temp.temp2.currschema()
    RETURNS STRING
    LANGUAGE JAVASCRIPT
    -- execute as caller
    execute as owner
    AS
    $$
    var cmd = "select current_schemas()";
    var stmt = snowflake.createStatement(
              {
              sqlText: cmd
              }
              );
    var result1 = stmt.execute();
    result1.next();
    return result1.getColumnValue(1);
    $$
    ;
    
    call temp.temp2.currschema();
    

    https://docs.snowflake.com/en/sql-reference/stored-procedures-rights.html

    【讨论】:

    • 感谢您的反馈。如果我们能够使用“EXECUTE AS OWNER”,这确实解决了问题,不幸的是我们需要使用“AS CALLER”选项。我应该将其包含在我原来的问题中;)我更新了问题以包含其他详细信息。
    • 思考:在 CREATE FUNCTION 时能否将架构包含为硬编码?
    • @hoffa 是的,我们可以对值进行硬编码,但如果可能的话,我们正试图找到一种避免该路径的方法。
    猜你喜欢
    • 1970-01-01
    • 2012-07-28
    • 1970-01-01
    • 1970-01-01
    • 2021-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-14
    相关资源
    最近更新 更多