Partilhar via


classe de erro TABLE_OR_VIEW_NOT_FOUND

SQLSTATE: 42P01

Não é possível localizar a tabela ou vista <relationName> . Verifique a ortografia e a correção do esquema e do catálogo.

Se não tiver qualificado o nome com um esquema, verifique a saída current_schema() ou qualifique o nome com o esquema e catálogo corretos.

Para tolerar o erro ao remover, utilize DROP VIEW IF EXISTS ou DROP TABLE IF EXISTS.

Parâmetros

  • relationName: o nome da relação especificada (tabela ou vista) que não pode ser encontrada.

Explicação

As tabelas e vistas persistentes consistem em três partes de nome: <catalog>.<schema>.<relation>. Se não especificar as três partes do nome, esta será concluída implicitamente com o catálogo atual ou o esquema atual. Isto é semelhante à forma como o diretório de trabalho do seu sistema de ficheiros influencia os ficheiros que pode ver, a menos que especifique totalmente o caminho.

As vistas temporárias ou expressões de tabela comuns (CTE) só existem na sessão ou consulta e nunca devem ser qualificadas.

A razão mais comum para não encontrar uma tabela ou vista é:

  • O objeto simplesmente não existe.
  • O nome, o esquema ou o catálogo do objeto foram escritos incorretamente.
  • O objeto não está localizado no esquema atual.
  • O utilizador não tem acesso ao objeto e, por conseguinte, não o consegue ver.

Mitigação

A mitigação do erro depende da causa:

  • Soletrou a tabela ou a vista, o esquema ou o nome do catálogo incorretamente?

    Corrija a ortografia.

  • Não qualificou totalmente o nome e o resultado de VALUES current_schema() não corresponde ao nome qualificado da tabela ou vista?

    Qualifique explicitamente o com o relationName respetivo esquema e catálogo ou emita um USE SCHEMA comando para definir o esquema implícito pretendido.

  • Fez referência a uma vista temporária, mas estava numa sessão anterior, expirada ou diferente?

    Recrie a vista temporária com CREATE TEMPORARY VIEW <relationName> …ou mude para uma vista permanente.

  • Fez referência a uma expressão de tabela comum (CTE), mas está fora do âmbito?

    Mova a definição do CTE para a consulta mais externa. Este é o início da instrução, pelo que é visível em todo o lado dentro da instrução.

  • Pretende emitir uma instrução DDL, como "DROP TABLE", caso o objeto exista?

    Emita a instrução com a IF EXISTS cláusula , como: DROP TABLE <relationName> IF EXISTS.

  • Sabe que o objeto existe, mas não consegue vê-lo em SHOW TABLE?

    Contacte o administrador para obter acesso à tabela concedida. Isto também poderá ter de incluir acesso ao esquema e catálogo.

  • Não é claro por que motivo não consegue resolver a tabela ou a vista?

    Consulte a Resolução de tabelas e vistas para obter uma descrição detalhada da resolução de nomes.

Exemplos

-- The table is located in othercat.someschema
> SELECT count(*) FROM t;
 [TABLE_OR_VIEW_NOT_FOUND] The table or view `t` cannot be found.

> VALUES current_schema();
 default

-- Change the current schema
> USE SCHEMA othercat.someschema;
> SELECT count(*) FROM T;
 1

-- Alternatively qualify the table
> SELECT count(*) FROM othercat.someschema.t;
 1

-- A reference to a CTE in the wrong scope:
> SELECT count(1) FROM (WITH v(c1) AS (VALUES (1)) VALUES(2)) AS t(c1), v;
 [TABLE_OR_VIEW_NOT_FOUND] The table or view `v` cannot be found.

-- Move the CTE to top level
> WITH v(c1) AS (VALUES (1))
  SELECT count(1) FROM VALUES(2) AS t(c1), v;
 1

-- Dropping a non existing view
> DROP VIEW v;
 [TABLE_OR_VIEW_NOT_FOUND] The table or view `v` cannot be found.

> DROP VIEW IF EXISTS v;