Snowflake cloud data platform 雪花:存储过程中的执行错误:SQL编译错误:对象不存在或未授权。在语句中执行

Snowflake cloud data platform 雪花:存储过程中的执行错误:SQL编译错误:对象不存在或未授权。在语句中执行,snowflake-cloud-data-platform,Snowflake Cloud Data Platform,我完全被雪花系统的许可模型搞糊涂了。我创建了一个数据库,在该数据库中创建了一个存储过程,并尝试使用SYSADMIN角色中的同一用户调用该存储过程。我得到错误“存储过程中的执行错误:SQL编译错误:对象不存在或未授权。At语句。执行” 我甚至不知道从哪里开始。我的用户如何没有权限访问由该用户创建的表 检查所指对象名称的大小写。例如,如果您创建了用双引号括起来的表,那么它是区分大小写的。雪花自动将不带引号的标识符转换为大写 例如: CREATE TABLE test1 ( test

我完全被雪花系统的许可模型搞糊涂了。我创建了一个数据库,在该数据库中创建了一个存储过程,并尝试使用SYSADMIN角色中的同一用户调用该存储过程。我得到错误“存储过程中的执行错误:SQL编译错误:对象不存在或未授权。At语句。执行”

我甚至不知道从哪里开始。我的用户如何没有权限访问由该用户创建的表


检查所指对象名称的大小写。例如,如果您创建了用双引号括起来的表,那么它是区分大小写的。雪花自动将不带引号的标识符转换为大写

例如:

    CREATE TABLE test1 (
    test nvarchar)

    CREATE TABLE "teSt2" (
    test nvarchar)

   -- This works
    select * from test1

   -- This doesn't work because the table was created wrapped in double quotes and with a capital S in the name
    select * from test2

   -- This doesn't work either because it will convert to UPPER
    select * from teSt2

   -- This works
    select * from "teSt2"

存储过程返回包含单个列的单行;它不是用来返回结果集的。但是,如果结果集足够小,可以放入VARIANT或ARRAY类型的单个值中,则可以从存储过程返回一个结果集,其中包含一些附加代码-

希望这有帮助

它适用于删除语句!示例如下:

use role sysadmin;
create or replace database DATA_IMPORTS_SO;
create or replace table ProductMaster_SO (id integer, name varchar);
insert into ProductMaster_SO values (1,'stackoverflow');
insert into ProductMaster_SO values (2,'stackoverflow');
select count(*) FROM DATA_IMPORTS_SO.PUBLIC.ProductMaster_SO;--2 rows
create or replace procedure Clenup_DI_Products()
returns string not null
language javascript
EXECUTE AS OWNER
as
$$
var sql_command = 
     "delete FROM DATA_IMPORTS_SO.PUBLIC.ProductMaster_SO";
    try {
        snowflake.execute (
            {sqlText: sql_command}
            );
        return "Succeeded.";   // Return a success/error indicator.
        }
    catch (err)  {
        return "Failed: " + err;   // Return a success/error indicator.
        }
$$;

call Clenup_DI_Products();
select count(*) FROM DATA_IMPORTS_SO.PUBLIC.ProductMaster_SO;--0 rows

最终,我无法找到存储过程无法工作的原因。最后我扔掉了桌子,用一个全大写的名字重新创建了它。在那之后,我能够运行存储过程而没有任何问题


我不清楚修复程序是使用UCASE名称创建表还是使用用户角色SYSADMIN命令重新创建表。

表的大小写敏感度可能没有问题,但可能与您创建的存储过程(函数)的权限有关

按以下方式更改代码可能会达到目的

EXECUTE AS OWNER -- Present
EXECUTE AS CALLER -- Change
要了解有关存储过程的所有者权限和调用方权限的更多信息,请访问以下链接。 有两件事需要检查

  • 用双引号将表名括起来。检查箱子
  • 将模式“SCHEMA_NAME”中所有表上的SELECT授予角色PUBLIC
    您是否创建了sp和错误所引用的表?是。我相信我已经在这个雪花帐户中用同一个用户在SYSADMIN角色下创建了所有内容。如果使用
    show tables
    Yes,您能看到该表吗?是的,该表显示了,并且它的所有者是SYSADMIN。这对我来说毫无意义。我真的希望这就是答案!唉,事实并非如此。我正在用第二个屏幕截图编辑原始帖子。实际上,我只让过程返回原始Select语句,而不是结果集。访问表本身时出错。在深入研究这个清理过程的真正目的之前,我试图让这个简单的选择工作起来。我没有授予用户在表或过程上的任何特权。并且能够使用同一用户(SYSADMIN)创建的表执行SP。你能给它一个机会来执行上面的代码,并让我们知道你是否面临错误吗?这肯定有效。我可以毫无问题地运行新创建的存储过程。我仍然不明白为什么现有的过程/表不能工作。我能说的最好的是所有的东西都归SYSADMIN所有,尽管我看不到任何地方可以看到谁拥有这个进程。我甚至放弃了proc,并使用sysadmin角色再次创建了它;命令仍然无法访问该表。