首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Snowflake:存储过程执行错误: SQL编译错误:对象不存在或未经授权。在Statement.execute

Snowflake:存储过程执行错误: SQL编译错误:对象不存在或未经授权。在Statement.execute
EN

Stack Overflow用户
提问于 2020-04-23 09:39:15
回答 5查看 5K关注 0票数 1

我完全被Snowflake系统的权限模型搞糊涂了。我创建了一个数据库,在该数据库中创建了一个存储过程,并尝试使用SYSADMIN角色中的同一用户调用该存储过程。我收到错误消息“存储过程中的执行错误: SQL编译错误:对象不存在或未授权。在Statement.execute”

我甚至不知道该从何说起。我的用户怎么会没有权限访问由该用户创建的表?

EN

回答 5

Stack Overflow用户

发布于 2020-04-23 15:29:01

检查您引用的对象名称的大小写。例如,如果您创建了包含在双引号中的表,则它区分大小写。Snowflake自动将未加引号的标识符转换为大写。

示例:

代码语言:javascript
复制
    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"
票数 2
EN

Stack Overflow用户

发布于 2020-04-23 22:09:01

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

希望这能有所帮助!

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

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2020-04-25 01:28:07

最终,我找不到存储过程无法工作的原因。我最终删除了该表,并使用全大写名称重新创建了它。在那之后,我就可以顺利地运行存储过程了。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61377923

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档