我完全被Snowflake系统的权限模型搞糊涂了。我创建了一个数据库,在该数据库中创建了一个存储过程,并尝试使用SYSADMIN角色中的同一用户调用该存储过程。我收到错误消息“存储过程中的执行错误: SQL编译错误:对象不存在或未授权。在Statement.execute”
我甚至不知道该从何说起。我的用户怎么会没有权限访问由该用户创建的表?


发布于 2020-04-23 15:29:01
检查您引用的对象名称的大小写。例如,如果您创建了包含在双引号中的表,则它区分大小写。Snowflake自动将未加引号的标识符转换为大写。
示例:
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"发布于 2020-04-23 22:09:01
存储过程返回包含单个列的一行;它不是用来返回结果集的。但是,如果您的结果集足够小,可以放入VARIANT或ARRAY类型的单个值中,则可以从存储过程返回带有一些附加代码的结果集- here
希望这能有所帮助!
它适用于delete语句!示例如下:
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发布于 2020-04-25 01:28:07
最终,我找不到存储过程无法工作的原因。我最终删除了该表,并使用全大写名称重新创建了它。在那之后,我就可以顺利地运行存储过程了。
我不清楚修复是使用UCASE名称创建表,还是使用用户角色SYSADMIN命令重新创建表。
https://stackoverflow.com/questions/61377923
复制相似问题