3

授予对雪花中所有存储过程的执行权限。

我在雪花数据库中创建了一个存储过程,但在尝试执行该存储过程时出现错误。

create or replace procedure get_column_scale(column_index float)
    returns float not null
    language javascript
    as
    $$
    var stmt = snowflake.createStatement(
        {sqlText: "select EmployeeKey, EmployeeCode from stproc_test_employees;"}
        );
    stmt.execute();  // ignore the result set; we just want the scale.
    return stmt.getColumnScale(COLUMN_INDEX); // Get by column index (1-based)
    $$
    ;

我正在执行如下

CALL get_column_scale(1);

尝试使用 Snowflake 执行存储过程时出现此错误

错误 [100183] [P0000]:存储过程 GET_COLUMN_SCALE 中的执行错误:
编译错误:
“SYEMPLOYEES”不存在或未授权。
Statement.execute,第 5 行位置 9

我在想它是我需要添加的执行权限,但我不知道在雪花中需要在哪里配置存储过程权限。

有人知道授予存储过程/表的权限吗?

4

2 回答 2

3

一些可能对你有帮助的事情。

  1. 我建议在 SELECT 语句中完全限定该表名,这样每当调用存储过程时,只要会话的当前角色可以访问表和模式,用户会话的“上下文”就无关紧要你应该很好。
    完全限定表具有以下形式:database_name.schema_name.object_name

    示例:hr_prod_db.hr_schema.employees

您可以在此链接中阅读有关对象名称解析的更多信息: https ://docs.snowflake.net/manuals/sql-reference/name-resolution.html

  1. 我建议您花一点时间阅读以下链接中的“会话状态”,因为该链接讨论了“调用者的权利”与“所有者的权利”存储过程。如果您的过程仅要从具有存储过程所有者角色的会话中调用,这无关紧要,但如果您将过程上的 USAGE 授予另一个角色,了解这一点并正确设置它非常重要. https://docs.snowflake.net/manuals/sql-reference/stored-procedures-usage.html#session-state

  2. 如果您的过程将由当前角色设置为与“拥有角色”不同的角色的会话调用,则您需要确保将过程(和模式+数据库)正确授权给当前角色将执行该过程。本文档中的所有内容都已详细介绍,请特别注意这一点,因为在您的示例代码中,您的表或视图名称与您的错误消息报告的名称不同,因此 stproc_test_employees 可能是SYEMPLOYEES 顶部的视图: https ://docs.snowflake.net/manuals/sql-reference/stored-procedures-usage.html#access-control-privileges 注意:当/如果您将此过程的使用权限授予另一个角色,您将需要包含参数的数据类型,例如:

    授予使用 database_name.schema_name.get_column_scale(float) TO ROLE other_role_name_here;

我希望这会有所帮助...丰富

于 2019-11-20T12:31:15.187 回答
1

对于那些在 2022 年阅读此答案的人,授予执行程序权限的正确语法如下:

GRANT USAGE ON PROCEDURE
    get_column_scale(float) 
    TO ROLE other_role_name_here;
于 2021-12-11T01:01:06.530 回答