domingo, 29 de enero de 2012

Eliminar todas las llaves foráneas de un usuario en Oracle

El siguiente es el código de un procedimiento Oracle que elimina todas las llaves foráneas de un usuario:

DECLARE

cadena VARCHAR(30000);

BEGIN

FOR registro IN (SELECT DISTINCT LOWER(A.TABLE_NAME) AS TABLE_NAME, LOWER(A.CONSTRAINT_NAME) AS CONSTRAINT_NAME

FROM ALL_CONSTRAINTS A, ALL_CONS_COLUMNS C

WHERE A.CONSTRAINT_TYPE = 'R'

AND A.OWNER = 'USUARIO'

AND A.CONSTRAINT_NAME = C.CONSTRAINT_NAME

ORDER BY 1,2)

LOOP

IF SUBSTR(registro.CONSTRAINT_NAME,0,1)='$' THEN

cadena := 'ALTER TABLE ' || registro.TABLE_NAME || ' DROP CONSTRAINT "' || registro.CONSTRAINT_NAME || '"';

ELSE

cadena := 'ALTER TABLE ' || registro.TABLE_NAME || ' DROP CONSTRAINT ' || registro.CONSTRAINT_NAME;

END IF;

DBMS_OUTPUT.PUT_LINE(cadena);

EXECUTE IMMEDIATE cadena;

END LOOP;

END;

Nota: es necesario reemplazar la palabra 'USUARIO' por el nombre del usuario.


domingo, 15 de enero de 2012

Eliminar todas las tablas de una base de datos PostgreSQL

Procedimiento:

1- Utilizamos el siguiente comando para generar automáticamente un script SQL con todos los DROPs:
~$ psql -h <hostname> -t -d <database> -U <username> -c "SELECT
'DROP TABLE ' || n.nspname || '.' || c.relname || ' CASCADE;'
FROM pg_catalog.pg_class c
LEFT JOIN pg_catalog.pg_user u ON u.usesysid = c.relowner
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind IN ('r','')
AND n.nspname NOT IN ('pg_catalog', 'pg_toast')
AND pg_catalog.pg_table_is_visible(c.oid)
ORDER BY 1;" > droptables
Donde:
  • <hostname> = Nombre de la máquina donde reside la base de datos
  • <database> = Nombre de la base de datos
  • <username> = Nombre de usuario
2- Ejecutamos el script generado en el paso anterior:
~$ psql -h <hostname> -d <database> -U <username> -f droptables



Consultar todos los índices en PostgreSQL y Oracle

PostgreSQL (hasta 14 índices por tabla):
SELECT
UPPER(t.relname) as table_name
UPPER(a.attname) as column_name
FROM
pg_class t,
pg_class i,
pg_index ix,
pg_attribute a,
pg_namespace
WHERE
t.oid = ix.indrelid
AND i.oid = ix.indexrelid
AND a.attrelid = t.oid
AND (
a.attnum = ix.indkey[0]
OR a.attnum = ix.indkey[1]
OR a.attnum = ix.indkey[2]
OR a.attnum = ix.indkey[3]
OR a.attnum = ix.indkey[5]
OR a.attnum = ix.indkey[6]
OR a.attnum = ix.indkey[7]
OR a.attnum = ix.indkey[8]
OR a.attnum = ix.indkey[9]
OR a.attnum = ix.indkey[10]
OR a.attnum = ix.indkey[11]
OR a.attnum = ix.indkey[12]
OR a.attnum = ix.indkey[13]
OR a.attnum = ix.indkey[14]
)
AND t.relkind = 'r'
AND t.relnamespace = pg_namespace.oid
AND pg_namespace.nspname = 'public'
ORDER BY
t.relname,
a.attname;

Oracle:
SELECT table_name, column_name
FROM user_ind_columns
ORDER BY table_name, column_name


lunes, 9 de enero de 2012

Limpiar/vaciar/eliminar un tablespace del tipo UNDO en Oracle

1-
CREATE UNDO TABLESPACE nuevo DATAFILE '/media/sdb1/nuevo.dbf' SIZE 1M AUTOEXTEND ON MAXSIZE 10M;

Donde:
  • SIZE -> Tamaño inicial en Megabytes.
  • AUTOEXTEND ON MAXSIZE -> Tamaño máximo en Megabytes.

2- 
ALTER SYSTEM SET UNDO_TABLESPACE = nuevo;

3-
DROP TABLESPACE UNDO;
Nota: reemplazar UNDO por el nombre del tablespace UNDO que quieres limpiar/vaciar/eliminar.


Como pudieron darse cuenta, la solución para limpiar/vaciar un tablespace tipo UNDO es sustituirlo por uno nuevo.

Saludos.