2012-07-20 15 views
5

Teradata tiene una vista útil llamada dbc.tables que puede usar para consultar objetos. Lo he usado para consultar el RequestText en vistas con éxito, pero los procedimientos parecen compilarse de forma un poco diferente.¿Puedo consultar un RequestText de un procedimiento en Teradata?

Cuando miro el RequestText de un procedimiento (TableKind P), lo único que consigue es algo como esto:

ALTER PROCEDURE '468137'xn.'546321987654321345646556213165468654654654'xn COMPILE /* mydb.procedurename */; 

¿Es esta una referencia a la RequestText real que se almacena en otro lugar? ¿Cómo puedo llegar?

Quiero consultarlo realmente con SQL, no volcarlo en un archivo de texto.

La razón es porque necesito ejecutar una declaración LIKE en su contra para buscar referencias a un nombre de tabla específico. Sería inconcebible tener que volcarlo en un archivo de texto y luego buscar el archivo de texto manualmente.

Respuesta

7

Los procedimientos almacenados se compilan para que sean un objeto ejecutable. En Windows, están compilados en DLL. En Unix, están compilados en objetos compartidos. Esos objetos se almacenan dentro de la base de datos propietaria.

Aquí hay una pregunta similar formulada en el Teradata Forums.

Visualización del Código de Procedimiento original

Ya que están compiladas, el código original ¿no es verdad visible en algún lugar como DBC.Tables, por lo que lamentablemente ya lo has encontrado, la siguiente consulta en DBC.Tables no lo hará trabajo.

SELECT * 
FROM DBC.Tables 
WHERE TableKind = 'P' 
AND RequestText LIKE '%abc%'; 

En cambio, la única manera de recuperar el código de procedimiento almacenado es ejecutar el siguiente:

SHOW PROCEDURE mydb.procedurename; 

Cómo encontrar procedimientos que contiene una especificados

Lo que me gustaría hacer es use VBScript o VBA para conectarse a Teradata a través de ODBC. Me gustaría primero ejecutar esto para obtener una lista de todos los procedimientos almacenados:

SELECT * 
FROM DBC.Tables 
WHERE TableKind = 'P'; 

Entonces, lo haría bucle a través de cada resultado y ejecutar el siguiente, guardar el resultado en una variable en VBA.

SHOW PROCEDURE <dbname>.<tablename>; 

me permitiría usar algo como la función InStr() de encontrar cuando el código contiene una determinada cadena de texto.

De acuerdo, esto es mucho más complicado que lo que inicialmente esperabas.

opción alternativa

Una opción alternativa es utilizar tablas en la base de datos DBQL, si están a su disposición.

Esta base de datos contiene algunas tablas de "registro" donde puede ver un historial de todas las sentencias de SQL ejecutadas en el sistema.

De esta manera, puede ejecutar el tipo de consulta que inicialmente esperaba con la condición LIKE.

+2

terminé escribiendo una utilidad de .NET que hace lo que sugiere y funciona muy bien. Una advertencia de la que otros pueden beneficiarse es que debe leer 'show procedure mydb.mysproc' en un TdDatareader y luego' 'while (reader.Read())' ya que cada línea en el sproc es una fila separada. Simplemente devolver un escalar solo devolverá la primera línea del sproc. Gracias por la sugerencia. – oscilatingcretin

0

El truco de MOSTRAR PROCEDIMIENTO puede no ser siempre aplicable ahora para Teradata 14.1 hasta Teradata 15 según lo probado; aunque no estoy seguro de la versión más reciente. Esto se debe a que los nombres de los objetos (es decir, Tablas, Vistas, Procedimiento almacenado, etc.) ahora pueden tener una longitud de caracteres de más de 30 caracteres. Si el nombre del objeto es más que eso, la vista DBC.Tables no podrá recuperar el registro para TABLENAME filtrado utilizando una condición de igualdad. En su lugar, es necesario utilizar un calificador de palabras clave "LIKE". DBC.Tables tiene una función SUBSTRING en la vista para limitar aún el nombre a 30. Todavía puede obtener el nombre completo de objeto/tabla a través de DBC.TVM; pero solo si tiene un privilegio de acceso SELECCIONADO que generalmente no se OTORGA aparte del DBA.

Saludos, Win

+0

Se recomendó usar el nuevo conjunto de vistas de sistema basado en Unicode desde TD12, 'dbc.TablesV' en lugar de' dbc.Tables'. – dnoeth

+0

Gracias, dnoeth, por compartir esta información. –

Cuestiones relacionadas