![](/img/trans.png)
[英]how to insert the new incremental data(keeping old records) into delta lake table azure databricks table from Source snowflake table
[英]SparkSQL (Databricks): Insert data into Snowflake Table, created by different role
我在使用角色CONSOLE_USER.
创建的 Snowflake 中有一个表MYSCHEMA.TEST_SNOWFLAKE_ROLE_T
。
MYSCHEMA
有一个与之关联的FUTURE GRANTS
,它为角色BATCH_USER
授予在模式MYSCHEMA - DELETE, INSERT, REFERENCES, SELECT, TRUNCATE, UPDATE.
角色BATCH_USER
还对模式MYSCHEMA
具有CREATE STAGE
和USAGE
权限。
属于角色BATCH_USER
的第二个用户尝试使用以下 Spark SQL (Databricks) 从 dataframe 将数据插入到同一个表中,但失败并显示权限不足错误消息。
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 文档,但似乎无法弄清楚是什么导致了权限不足的问题。
任何帮助深表感谢!
我最终想通了。
发生错误是因为该表是由角色CONSOLE_USER
创建的,该角色保留了该表的所有权权限。
Snowflake 的 Spark 连接器使用临时表来写入数据。 如果数据加载操作成功,则删除原始目标表并将临时表重命名为原始目标表的名称。
现在,为了重命名表或交换两个表,用于执行操作的角色必须对表具有 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 强烈建议使用一个。
这是对自定义权限进行故障排除的一个很好的参考: https://docs.snowflake.net/manuals/user-guide/security-access-control-overview.html#role-hierarchy-and-privilege-inheritance
显示补助金
显示角色授予
在 SCHEMA { } 中显示未来的资助
当他们尝试写入“dbtable”时,是否为第二个 batch_user 指定了角色?
3.既然你提到了未来授权被用于创建的对象 - 未来通过https://community.snowflake.com/s/question/0D50Z00009MDCBv/can-a-role-have-rights-to-grant限制为 SECURITYADMIN -未来的权利
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.