sql - usuario - ¿Busca en una base de datos Oracle tablas con nombres de columna específicos?
dar permisos a un usuario sobre un esquema oracle (5)
Aquí hay uno que hemos guardado en findcol.sql para que podamos ejecutarlo fácilmente desde SQLPlus
set verify off
clear break
accept colnam prompt ''Enter Column Name (or part of): ''
set wrap off
select distinct table_name,
column_name,
data_type || '' ('' ||
decode(data_type,''LONG'',null,''LONG RAW'',null,
''BLOB'',null,''CLOB'',null,''NUMBER'',
decode(data_precision,null,to_char(data_length),
data_precision||'',''||data_scale
), data_length
) || '')'' data_type
from all_tab_columns
where column_name like (''%'' || upper(''&colnam'') || ''%'');
set verify on
Tenemos una gran base de datos Oracle con muchas tablas. ¿Hay alguna manera de consultar o buscar para encontrar si hay tablas con ciertos nombres de columna?
IE me muestra todas las tablas que tienen las columnas: id, fname, lname, address
Detalle Olvidé agregar: necesito poder buscar a través de diferentes esquemas. El que debo usar para conectarme no posee las tablas que necesito buscar.
Los datos que desea están en la tabla de metadatos "cols":
SELECT * FROM COLS WHERE COLUMN_NAME = ''id''
Éste le dará una lista de tablas que tienen todas las columnas que desea:
select distinct
C1.TABLE_NAME
from
cols c1
inner join
cols c2
on C1.TABLE_NAME = C2.TABLE_NAME
inner join
cols c3
on C2.TABLE_NAME = C3.TABLE_NAME
inner join
cols c4
on C3.TABLE_NAME = C4.TABLE_NAME
inner join
tab t
on T.TNAME = C1.TABLE_NAME
where T.TABTYPE = ''TABLE'' --could be ''VIEW'' if you wanted
and upper(C1.COLUMN_NAME) like upper(''%id%'')
and upper(C2.COLUMN_NAME) like upper(''%fname%'')
and upper(C3.COLUMN_NAME) like upper(''%lname%'')
and upper(C4.COLUMN_NAME) like upper(''%address%'')
Para hacer esto en un esquema diferente, simplemente especifique el esquema al frente de la tabla, como en
SELECT * FROM SCHEMA1.COLS WHERE COLUMN_NAME LIKE ''%ID%'';
Si desea combinar las búsquedas de muchos esquemas en un resultado de salida, puede hacer esto:
SELECT DISTINCT
''SCHEMA1'' AS SCHEMA_NAME
,TABLE_NAME
FROM SCHEMA1.COLS
WHERE COLUMN_NAME LIKE ''%ID%''
UNION
SELECT DISTINCT
''SCHEMA2'' AS SCHEMA_NAME
,TABLE_NAME
FROM SCHEMA2.COLS
WHERE COLUMN_NAME LIKE ''%ID%''
Para buscar un nombre de columna, utilice la consulta siguiente si conoce el nombre de la columna con precisión:
select owner,table_name from all_tab_columns where upper(column_name) =upper(''keyword'');
PARA buscar un nombre de columna si no conoce el uso preciso de columna a continuación:
select owner,table_name from all_tab_columns where upper(column_name) like upper(''%keyword%'');
Para encontrar todas las tablas con una columna en particular:
select owner, table_name from all_tab_columns where column_name = ''ID'';
Para buscar tablas que tengan alguna o todas las 4 columnas:
select owner, table_name, column_name
from all_tab_columns
where column_name in (''ID'', ''FNAME'', ''LNAME'', ''ADDRESS'');
Para encontrar tablas que tengan las 4 columnas (sin ninguna falta):
select owner, table_name
from all_tab_columns
where column_name in (''ID'', ''FNAME'', ''LNAME'', ''ADDRESS'')
group by owner, table_name
having count(*) = 4;
seleccione table_name de dba_tab_columns donde column_name = ''THE_COLUMN_YOU_LOOK_FOR'';