varias - sql transponer columnas a filas
¿Por qué Oracle no te dice CUÁL tabla o vista no existe? (8)
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.
@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.
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
Nunca tuve problemas para interpretar los mensajes de error de Oracle. Parte de la razón es que cada herramienta interactiva que he visto para desarrollar SQL para Oracle apunta útilmente a la ubicación incorrecta de la consulta. Eso incluye SQL * Plus, como otros han notado, y el módulo Perl DBI:
$ exec_sql.pl ''select * from daul''
DBD::Oracle::db prepare failed: ORA-00942: table or view does not exist (DBD ERROR: error possibly near <*> indicator at char 14 in ''select * from <*>daul'') [for Statement "select * from daul"] at exec_sql.pl line 68.
Bueno, eso es un poco difícil de leer, ya que está todo aplastado en una línea. Pero una herramienta de GUI podría apuntar al token donde Oracle comenzó a tener problemas con la consulta. Y dado un poco de trabajo en un analizador sintáctico, podría escribir una herramienta para seleccionar la tabla ofensiva.
Para responder a la pregunta subyacente, los errores de Oracle no parecen estar diseñados para funcionar de la manera esperada. Por lo que puedo decir, ninguno de los mensajes de error en Oracle admite texto variable. En cambio, Oracle devuelve dos bits de información: un número de error y una ubicación donde se produce el error. Si tiene las herramientas adecuadas, es bastante fácil diagnosticar un error con esos datos. Se puede argumentar que el sistema de Oracle es más agradable para los creadores de herramientas que uno que proporciona cantidades variables de datos de diagnóstico según el error. Imagine tener que escribir un analizador personalizado para todos los mensajes de error de Oracle (incluidos los errores futuros) para resaltar la ubicación ofensiva.
A veces, incluir el nombre de la tabla sería engañoso. El solo hecho de saber dónde salieron las cosas puede ser de gran ayuda:
SQL> select * from where dummy = ''X'';
select * from where dummy = ''X''
*
ERROR at line 1:
ORA-00903: invalid table name
En cuanto a por qué Oracle eligió hacer las cosas de esta manera, tengo algunas especulaciones:
IBM usó este estilo de mensaje de error para System R, que Larry Ellison, Bob Miner y Ed Oates copiaron para construir Oracle V2. (Compatibilidad con versiones anteriores.)
El número de error y la ubicación son la representación más pequeña posible de la información de diagnóstico. (Parsimonia.)
Como indiqué anteriormente, para simplificar la creación de herramientas que se conectan a Oracle. (Interoperabilidad)
En cualquier caso, no creo que deba ser un DBA para averiguar qué tabla no existe. Solo necesitas usar las herramientas adecuadas. (Y ajuste sus expectativas, supongo)
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 está utilizando una herramienta de exploración SQL como TOAD o TORA, le ayudará con los errores de ORA resaltando o señalando moviendo el cursor al lugar donde cometió su error.
Copie y pegue su SQL en una de estas herramientas para ayudar. También puede encontrar útil la información de análisis disponible.
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).