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

Pyspark SparkSQL(Databricks):将数据插入由不同角色创建的雪花表中,pyspark,apache-spark-sql,privileges,snowflake-cloud-data-platform,Pyspark,Apache Spark Sql,Privileges,Snowflake Cloud Data Platform,我有一个表MYSCHEMA.TEST\u SNOWFLAKE\u ROLE\u T在SNOWFLAKE中使用角色控制台用户创建。 MYSCHEMA有一个与之关联的FUTURE GRANTS,它为角色BATCH\u用户授予以下特权,用于在架构MYSCHEMA下创建的任何表-删除、插入、引用、选择、截断、更新。 角色BATCH\u USER在模式MYSCHEMA上还具有CREATE STAGE和USAGE权限 属于角色BATCH\u user的第二个用户尝试使用以下Spark SQL(DataRic

我有一个表
MYSCHEMA.TEST\u SNOWFLAKE\u ROLE\u T
在SNOWFLAKE中使用角色
控制台用户创建。

MYSCHEMA
有一个与之关联的
FUTURE GRANTS
,它为角色
BATCH\u用户
授予以下特权,用于在架构
MYSCHEMA下创建的任何表-删除、插入、引用、选择、截断、更新。

角色
BATCH\u USER
在模式
MYSCHEMA
上还具有
CREATE STAGE
USAGE
权限

属于角色
BATCH\u user
的第二个用户尝试使用以下Spark SQL(DataRicks)将数据从数据帧插入到同一个表中,但失败并显示权限不足错误消息

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\u USER
拥有表的所有权,因此角色
BATCH\u USER
将无法删除表,但是添加选项
选项(“truncate\u table”,“on”)
应该可以防止自动覆盖表架构

我已经多次查看了可用的Snowflake和Databricks文档,但似乎无法找出导致权限不足问题的原因


非常感谢您的帮助

这是一个很好的自定义权限疑难解答参考:

  • 第二批用户是否继承了任何特权? 通过询问会话中的用户查看他们在表上拥有哪些权限来检查这一点: 对于存在以下访问问题的Batch_用户,列出了哪些授权:
  • 显示拨款

    显示角色授权

    在架构{}中显示未来授予

  • 当第二批用户尝试写入“dbtable”时,是否为其指定了角色

    • 当用户试图在对象上执行操作时,Snowflake会将用户会话中可用的权限与该操作在对象上所需的权限进行比较。如果会话对该对象具有所需的权限,则允许该操作 尝试:

  • 3.由于您提到在所创建的对象上使用了未来授权-通过

    将未来授权限制为SECURITYADMIN,这是解决自定义权限问题的一个很好的参考:

  • 第二批用户是否继承了任何特权? 通过询问会话中的用户查看他们在表上拥有哪些权限来检查这一点: 对于存在以下访问问题的Batch_用户,列出了哪些授权:
  • 显示拨款

    显示角色授权

    在架构{}中显示未来授予

  • 当第二批用户尝试写入“dbtable”时,是否为其指定了角色

    • 当用户试图在对象上执行操作时,Snowflake会将用户会话中可用的权限与该操作在对象上所需的权限进行比较。如果会话对该对象具有所需的权限,则允许该操作 尝试:

  • 3.由于您提到未来授权用于创建的对象-未来授权仅限于SECURITYADMIN,通过

    我最终找到了答案

    出现此错误是因为该表是由角色
    控制台用户创建的,该角色保留了对该表的所有权特权

    Snowflake的火花连接器使用a来写入数据。如果数据加载操作成功,则删除原始目标表,并将临时表重命名为原始目标表的名称

    现在,要重命名一个或两个表,用于执行操作的角色必须对该表具有所有权特权。在上述情况下,所有权从未转移到角色
    批处理用户
    ,因此出现错误

    df.write.mode(op_mode)                   \ 
      .format("snowflake")                   \ 
      .options(**self.sfoptions)             \
      .option("dbtable", snowflake_tbl_name) \
      .option("truncate_table", "on")        \
      .option("usestagingtable", "off")      \
      .save
    

    解决方案是避免完全使用临时表,尽管根据文档,Snowflake强烈建议使用临时表。

    我最终找到了答案

    出现此错误是因为该表是由角色
    控制台用户创建的,该角色保留了对该表的所有权特权

    Snowflake的火花连接器使用a来写入数据。如果数据加载操作成功,则删除原始目标表,并将临时表重命名为原始目标表的名称

    现在,要重命名一个或两个表,用于执行操作的角色必须对该表具有所有权特权。在上述情况下,所有权从未转移到角色
    批处理用户
    ,因此出现错误

    df.write.mode(op_mode)                   \ 
      .format("snowflake")                   \ 
      .options(**self.sfoptions)             \
      .option("dbtable", snowflake_tbl_name) \
      .option("truncate_table", "on")        \
      .option("usestagingtable", "off")      \
      .save
    

    解决方案是避免完全使用临时表,尽管根据文档,Snowflake强烈建议使用临时表。

    谢谢Rachel,我最终找到了答案。不过我不确定是否有更好的解决方案。谢谢瑞秋,我终于找到了。不过,我不确定是否有更好的解决方案。