sql - varias - ¿Por qué Oracle no te dice CUÁL tabla o vista no existe?




unpivot sql server ejemplo (6)

@Matthew

Su consulta es un comienzo, pero podría no funcionar cuando tenga varios esquemas. Por ejemplo, si inicio sesión en nuestra instancia como yo mismo, he leído el acceso a todas nuestras tablas. Pero si no califico el nombre de la tabla con el esquema obtendré un ORA-00942 para tablas sin sinónimos:

SQL> select * from tools; 
select * from tools 
              * 
ERROR at line 1: 
ORA-00942: table or view does not exist 

La tabla todavía aparece en all_tables:

SQL> select owner, table_name from all_tables where table_name = 'TOOLS'; 

OWNER                          TABLE_NAME 
------------------------------ ------------------------------ 
APPLICATION                    TOOLS 

@erikson Lo siento, eso no ayuda mucho. Estoy con Mark, usé TOAD.

Si usó Oracle, probablemente haya recibido el mensaje útil "ORA-00942: la tabla o vista no existe". ¿Existe una razón técnica legítima por la cual el mensaje no incluye el nombre del objeto faltante?

Los argumentos sobre esto debido a la seguridad suenan como si hubieran sido elaborados por la TSA. Si soy un atacante, sabría qué tabla intenté explotar y podría interpretar fácilmente este mensaje inútil. Si soy un desarrollador que trabaja con una unión compleja a través de varias capas de código de aplicación, a menudo es muy difícil de decir.

Supongo que cuando se implementó este error originalmente, alguien descuidó agregar el nombre del objeto, y ahora la gente teme que rompa la compatibilidad para solucionarlo. (El código que haga cosas tontas como analizar el mensaje de error se confundirá si cambia).

¿Existe una forma amigable con los desarrolladores (en lugar de contratar a su DBA) para determinar el nombre de la tabla faltante?

Aunque he aceptado una respuesta que es relevante para el tema, realmente no responde mi pregunta: ¿por qué el nombre no forma parte del mensaje de error? Si alguien puede dar con la respuesta real, me complacerá cambiar mi voto.


No estaría de acuerdo con la opinión de que SQL + le permite comprender qué nombre de tabla es inaceptable. Es cierto que ayuda en DML directo, aunque el análisis es muy difícil. Pero cuando se trata de dinámica, no recibimos ayuda:

SQL> begin
  2  execute immediate 'insert into blabla values(1)';
  3  end;
  4  /
begin
*
ERROR at line 1:
ORA-00942: table or view does not exist
ORA-06512: at line 2

Puede establecer un EVENTO en su archivo de parámetros (texto sin formato o archivo spf) para forzar a Oracle a volcar un archivo de rastreo detallado en el archivo user_dump_dest, el nombre del objeto podría estar ahí, si no el SQL debería estar.

EVENT = "942 nombre de rastreo errorstack nivel 12"

Si está utilizando un archivo de texto sin formato, necesita mantener todos los ajustes de EVENTOS en líneas consecutivas. No estoy seguro de cómo se aplica a spfile.


SQL * Plus te dice la tabla que no existe. Por ejemplo:

SQL> select
  2     *
  3  from
  4     user_tables a,
  5     non_existent_table b
  6  where
  7     a.table_name = b.table_name;
   non_existent_table b
   *
ERROR at line 5:
ORA-00942: table or view does not exist

Aquí muestra que el nombre de la tabla faltante y el número de línea en la declaración SQL donde ocurre el error.

Del mismo modo, en una declaración SQL de una línea, puede ver el asterisco resaltando el nombre de la tabla desconocida:

SQL> select * from user_tables a, non_existent_table b where a.table_name = b.table_name;
select * from user_tables a, non_existent_table b where a.table_name = b.table_name
                             *
ERROR at line 1:
ORA-00942: table or view does not exist

En términos de su pregunta, creo que la razón por la cual el mensaje de error no incluye el nombre de la tabla es que el mensaje de error en sí debe ser texto estático. El número de línea y la ubicación en la línea del error se pasan claramente a SQL * Plus (de alguna manera).


Si no es una gran declaración, entonces la forma más fácil es simplemente consultar el diccionario de datos,

SQL> select * from xx,abc;
select * from xx,abc
                 *
ERROR at line 1:
ORA-00942: table or view does not exist


SQL> select owner,table_name from all_tables where table_name in ('XX','ABC');

OWNER                          TABLE_NAME
------------------------------ ------------------------------
MWATSON                        XX

SQL> 

Esto no es ideal, pero a falta de ir y examinar los archivos de seguimiento, no estoy seguro de qué otra manera hacerlo.


Razón 1: interfaz multilingüe

Hay un archivo de configuración de mensaje específico del idioma para su instancia de base de datos. Los mensajes se extraen de allí y se traducen de la versión numérica pura a la versión numérica + texto.

Probablemente se consideró mejor tener las cadenas codificadas, que correr el riesgo en el tiempo de ejecución de tener una falla misteriosa debido a una cadena "% s" mal formateada.

(No es que esté particularmente de acuerdo con este POV, por cierto).

Razón 2: seguridad

En este momento no expone particularmente el funcionamiento interno de su aplicación si imprime un PHP, etc., un volcado de un mensaje de error de Oracle en el navegador.

Las aplicaciones estarían un poco más expuestas si se imprimieran más detalles por defecto ... Por ejemplo, si citibank imprimiera un mensaje más explicativo.

(ver la cláusula de exención de responsabilidad anterior, me gustaría obtener más información sobre el error también).





ora-00942