Snowflake cloud data platform 雪花:存储过程中的执行错误:SQL编译错误:对象不存在或未授权。在语句中执行
我完全被雪花系统的许可模型搞糊涂了。我创建了一个数据库,在该数据库中创建了一个存储过程,并尝试使用SYSADMIN角色中的同一用户调用该存储过程。我得到错误“存储过程中的执行错误:SQL编译错误:对象不存在或未授权。At语句。执行” 我甚至不知道从哪里开始。我的用户如何没有权限访问由该用户创建的表Snowflake cloud data platform 雪花:存储过程中的执行错误:SQL编译错误:对象不存在或未授权。在语句中执行,snowflake-cloud-data-platform,Snowflake Cloud Data Platform,我完全被雪花系统的许可模型搞糊涂了。我创建了一个数据库,在该数据库中创建了一个存储过程,并尝试使用SYSADMIN角色中的同一用户调用该存储过程。我得到错误“存储过程中的执行错误:SQL编译错误:对象不存在或未授权。At语句。执行” 我甚至不知道从哪里开始。我的用户如何没有权限访问由该用户创建的表 检查所指对象名称的大小写。例如,如果您创建了用双引号括起来的表,那么它是区分大小写的。雪花自动将不带引号的标识符转换为大写 例如: CREATE TABLE test1 ( test
检查所指对象名称的大小写。例如,如果您创建了用双引号括起来的表,那么它是区分大小写的。雪花自动将不带引号的标识符转换为大写 例如:
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
要了解有关存储过程的所有者权限和调用方权限的更多信息,请访问以下链接。
有两件事需要检查
您是否创建了sp和错误所引用的表?是。我相信我已经在这个雪花帐户中用同一个用户在SYSADMIN角色下创建了所有内容。如果使用
show tables
Yes,您能看到该表吗?是的,该表显示了,并且它的所有者是SYSADMIN。这对我来说毫无意义。我真的希望这就是答案!唉,事实并非如此。我正在用第二个屏幕截图编辑原始帖子。实际上,我只让过程返回原始Select语句,而不是结果集。访问表本身时出错。在深入研究这个清理过程的真正目的之前,我试图让这个简单的选择工作起来。我没有授予用户在表或过程上的任何特权。并且能够使用同一用户(SYSADMIN)创建的表执行SP。你能给它一个机会来执行上面的代码,并让我们知道你是否面临错误吗?这肯定有效。我可以毫无问题地运行新创建的存储过程。我仍然不明白为什么现有的过程/表不能工作。我能说的最好的是所有的东西都归SYSADMIN所有,尽管我看不到任何地方可以看到谁拥有这个进程。我甚至放弃了proc,并使用sysadmin角色再次创建了它;命令仍然无法访问该表。