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

时间:2019-09-23 09:42:40

标签: pyspark apache-spark-sql privileges snowflake-data-warehouse

我在Snowflake中有一个使用角色MYSCHEMA.TEST_SNOWFLAKE_ROLE_T创建的表CONSOLE_USER.

MYSCHEMA有一个与之关联的FUTURE GRANTS,它为在模式BATCH_USER下创建的任何表的角色MYSCHEMA - DELETE, INSERT, REFERENCES, SELECT, TRUNCATE, UPDATE.授予了以下特权

角色BATCH_USER在模式CREATE STAGE上也具有USAGEMYSCHEMA特权。

属于角色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文档,但是似乎无法弄清楚是什么原因导致特权不足问题。

非常感谢您的帮助!

2 个答案:

答案 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

  1. 第二个batch_user是否继承任何特权? 通过在会话中询问用户以查看他们在表上拥有哪些特权来进行检查:https://docs.snowflake.net/manuals/sql-reference/sql/show-grants.html 为Batch_user列出的对以下项目有访问权限的授予是什么:
  

SHOW GRANTS ON

     

角色授予

     

SCHEMA {}中的显示未来授权书

  1. 第二个batch_user尝试写入“ dbtable”时是否为其指定了角色?

3。自从您提到了“未来赠款”已用于创建的对象-未来将通过https://community.snowflake.com/s/question/0D50Z00009MDCBv/can-a-role-have-rights-to-grant-future-rights限制为SECURITYADMIN