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文档,但似乎无法找出导致权限不足问题的原因
非常感谢您的帮助 这是一个很好的自定义权限疑难解答参考:
- 当用户试图在对象上执行操作时,Snowflake会将用户会话中可用的权限与该操作在对象上所需的权限进行比较。如果会话对该对象具有所需的权限,则允许该操作 尝试:
3.由于您提到在所创建的对象上使用了未来授权-通过将未来授权限制为SECURITYADMIN,这是解决自定义权限问题的一个很好的参考:
- 当用户试图在对象上执行操作时,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,我最终找到了答案。不过我不确定是否有更好的解决方案。谢谢瑞秋,我终于找到了。不过,我不确定是否有更好的解决方案。