繁体   English   中英

SparkSQL(Databricks):将数据插入到由不同角色创建的雪花表中

[英]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 STAGEUSAGE权限。

属于角色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

  1. 第二个 batch_user 是否继承了任何特权? 通过询问 session 中的用户查看他们在桌子上拥有哪些权限来检查这一点: https://docs.snowflake.net/manuals/sql-reference/sql/show-grants.ZFC35FDC70D5FC67A53E8列出的授权是什么Batch_user 对以下内容有访问问题:

显示补助金

显示角色授予

在 SCHEMA { } 中显示未来的资助

  1. 当他们尝试写入“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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM