我在Snowflake中有一个使用角色MYSCHEMA.TEST_SNOWFLAKE_ROLE_T
创建的表CONSOLE_USER.
MYSCHEMA
有一个与之关联的FUTURE GRANTS
,它为在模式BATCH_USER
下创建的任何表的角色MYSCHEMA - DELETE, INSERT, REFERENCES, SELECT, TRUNCATE, UPDATE.
授予了以下特权
角色BATCH_USER
在模式CREATE STAGE
上也具有USAGE
和MYSCHEMA
特权。
属于角色BATCH_USER
的第二个用户尝试使用以下Spark SQL(Databricks)将数据从数据帧插入同一表中,但由于权限不足错误消息而失败。
df.write.mode(op_mode) \
.format("snowflake") \
.options(**self.sfoptions) \
.option("dbtable", snowflake_tbl_name) \
.option("truncate_table", "on") \
.save
出现以下错误消息:
Py4JJavaError: An error occurred while calling o908.save.
: net.snowflake.client.jdbc.SnowflakeSQLException: SQL access control error
: Insufficient privileges to operate on table 'TEST_SNOWFLAKE_ROLE_T')
角色CONSOLE_USER
对表具有所有权,因此,角色BATCH_USER
将无法删除表,但是添加选项option("truncate_table", "on")
应该可以防止自动覆盖表架构。
我已经多次浏览了可用的Snowflake和Databricks文档,但是似乎无法弄清楚是什么原因导致特权不足问题。
非常感谢您的帮助!
答案 0 :(得分:1)
我终于明白了。
发生此错误是因为表是由角色CONSOLE_USER
创建的,该角色保留了表的所有权特权。
Snowflake的Spark连接器使用staging table写入数据。如果数据加载操作成功,则将删除原始目标表,并将登台表重命名为原始目标表的名称。
现在,为了重命名一个表或两个swap表,用于执行该操作的角色必须对该表具有OWNERSHIP特权。在上述情况下,所有权从未转移到角色BATCH_USER
,因此会出现错误。
df.write.mode(op_mode) \
.format("snowflake") \
.options(**self.sfoptions) \
.option("dbtable", snowflake_tbl_name) \
.option("truncate_table", "on") \
.option("usestagingtable", "off") \
.save
解决方案是避免完全使用登台表,尽管按照文档进行操作,Snowflake建议强烈使用一个登台表。
答案 1 :(得分:0)
这是对自定义特权进行故障排除的很好的参考: https://docs.snowflake.net/manuals/user-guide/security-access-control-overview.html#role-hierarchy-and-privilege-inheritance
SHOW GRANTS ON
角色授予
SCHEMA {}中的显示未来授权书
第二个batch_user尝试写入“ dbtable”时是否为其指定了角色?
3。自从您提到了“未来赠款”已用于创建的对象-未来将通过https://community.snowflake.com/s/question/0D50Z00009MDCBv/can-a-role-have-rights-to-grant-future-rights限制为SECURITYADMIN