Falha na criação da tabela com exceção de segurança

Problema

Tenta criar uma tabela utilizando um cluster que tenha ACLs de tabela ativados, mas ocorre o seguinte erro:

Error in SQL statement: SecurityException: User does not have permission SELECT on any file.

Causa

Este erro ocorre num cluster ativado por ACL de tabela se não for administrador e não tiver privilégios suficientes para criar uma tabela.

Por exemplo, no seu caderno tenta criar uma tabela utilizando uma fonte de dados Parquet localizada no Armazenamento Azure Blob:

CREATE TABLE mytable
  USING PARQUET
  OPTIONS (PATH='wasbs://my-container@my-storage-account.blob.core.windows.net/my-table')

Solução

Deverá solicitar ao seu administrador que lhe conceda acesso ao sistema de ficheiros de armazenamento de bolhas,utilizando qualquer uma das seguintes opções. Se um administrador não lhe puder conceder acesso ao objeto de dados, terá de pedir a um administrador que faça a tabela para si.

  • Se pretender utilizar uma CTAS (CREATE TABLE AS SELECT) declaração para criar a tabela, o administrador deverá conceder-lhe SELECT privilégios no sistema de ficheiros:

    GRANT SELECT ON ANY FILE TO `user1`
    

    Exemplo da declaração CTAS:

    CREATE TABLE mytable
          AS SELECT * FROM parquet.`wasbs://my-container@my-storage-account.blob.core.windows.net/my-table`
    
  • Se quiser usar uma CTOP (CREATE TABLE OPTIONS PATH) declaração para fazer a mesa, o administrador deve elevar os seus privilégios concedendo para MODIFY além de SELECT .

    GRANT SELECT, MODIFY ON ANY FILE TO `user1`
    

    Declaração CTOP de exemplo:

    CREATE TABLE mytable
       USING PARQUET
       OPTIONS (PATH='wasbs://my-container@my-storage-account.blob.core.windows.net/my-table')
    

Importante

É importante compreender as implicações de segurança da concessão de ANY FILE permissões num sistema de ficheiros. Só deve conceder ANY FILE a utilizadores privilegiados. Os utilizadores com privilégios mais baixos no cluster nunca devem aceder aos dados referindo-se a um local de armazenamento real. Em vez disso, devem aceder aos dados de tabelas criadas por utilizadores privilegiados, garantindo assim que a Tabela ACLS é aplicada.

Além disso, se os ficheiros na raiz do Azure Databricks e baldes de dados forem acessíveis pelo cluster e os utilizadores tiverem MODIFY privilégios, o administrador deve bloquear a raiz do DBFS.

Conceder os privilégios de acesso aos dados acima descritos não substitui quaisquer permissões subjacentes ao utilizador ou controlo de acesso ao contentor blob. Por exemplo, se uma declaração de subvenção como GRANT SELECT, MODIFY ON ANY FILE TO o utilizador1'' for executada, mas uma permissão do utilizador anexada ao cluster nega explicitamente as leituras para o recipiente-alvo, então a GRANT declaração não tornará o recipiente ou os objetos dentro do recipiente de repente legíveis.