martes, 14 de abril de 2009

Clonar esquemas

Porque no se puede hacer clonar un schema o cliente de forma facil en oracle ???
no se.. nunca lo enternderé. estimado Juan Oracle.. algo así como clon user to user1 estaria formdiable!!!!

como eso no existe..tenemos que exportar y luego importar...pero no esta taaaannn fácil..
Veamos los detalle:

primero creamos un directorio, esto es porque con Oracle Data Pump es necesario crear el directorio de salida.

conectados com sys


create directory mydir as 'c:\dpdump';
grant read,write on directory mydir to pepe;

luego desde la linea de comando ejecutamos el expdp


expdp asanga/asa directory=mydir dumpfile=salidapepe.dmp schemas=pepe logfile=salidapepe.log

luego como sys (que es mas facil)
importamos el esquema en otro esquema a traves de la maravillosa palabra clava: remap_schemas

impdp directory=mydir dumpfile=salidapepe.dmp logfile=import2pepenew.log remap_schema=pepe:pepenew

mmmm....bueno no es taaannnn fácil si tenemos algunos detalles..Veamos:
si tenemos tipos creados por el objeto pepe necesitamos agregar
transform=oid:n:type en la sentencia del import

impdp directory=mydir dumpfile=salidapepe.dmp logfile=import2pepenew.log remap_schema=pepe:pepenew transform=oid:n:type

obviamente esta es la forma CHANCHA... ya que es como tener 2 tipos number en nuestra base...lo que deberiamos hacer es crear un esquema que solo tenga los tipos..y darle permisos al resto de los esquemas para que lo puedan utilizar.. pero tá..por ahora nos quedamos con la forma chancha !! :D

otra cosa a tener en cuenta es si el usuario tiene privilegios sobre todo si utilizamos STORE PROCEDURES que hacen uso de esos privilegios..
en ese caso.. antes de hacer el import...hay que CREAR EL USUARIO A MANO !!!!

create user pepenew identified by pepenew

Y DARLE LOS PRIVILEGIOS
para obtener los privilegios de pepe.. hay un montón de scripts en la vuelta... yo uso el del gran gurú y mentor pete finnigan que está muy bueno.

grant ...... to pepenew

y después ...solo después... hacemos el import.

y si... ....algo que tienen que ser....
clon user pepe pepenew
se transforma en un dolor de kbza!!! ponete las pilas Juan !!!



lunes, 13 de abril de 2009

Crear Tablas en un Store procedure PL/SQL - ORA-01031: insufficient privileges

Bueno... aquí hay un poblemita, que si bien es muy facil de solucionar es "raro" que luego de tantas versiones siga pasando.... :D

el tema es el siguiente.. Crear un tabla dentro de un Porcedimiento.
si ejecutamos CREATE TABLE pepe (....... desde linea de comando funciona perfectamente...pero si lo hacemos :

script_crear := 'CREATE TABLE PEPE (NUM NUMBER ,DATOS VARCHAR2(50))';
EXECUTE IMMEDIATE script_crear;

Nos devuleve el error:
ORA-01031: insufficient privileges

Solucion: Dar los permisos de forma directa, es decir.

grant create table to usuario.


Por que pasa esto?? bueno el "problemita" se da porque los ROLES no son tomados en los procedimientos PLSQL, es decir si tenemos un permiso obtenido a través de un ROL, este permiso no lo tendremos dentro de los procedimientos o funciones PL/SQL, mmmm bueno, en si... si lo ejecutamos en un bloque anonimo funcionaria pero.. más facil es darle el permiso de forma directa y problema solucionado.

Como siempre hay un buen link, con comentarios de gente que sabe :D

http://forums.oracle.com

miércoles, 1 de abril de 2009

ORA-02449 Cuando queremos borrar o truncar una tabla

ORA-02449: claves únicas/primarias en la tabla referidas por claves ajenas


Para saber cueles son FK que apuntan a mi tabla se puede ejecutar la siguiente consulta:


SELECT A.CONSTRAINT_NAME, A.TABLE_NAME, B.COLUMN_NAME,
B.COLUMN_NAME AS REFERENCED_COLUMN_NAME,
B.TABLE_NAME AS REFERENCED_TABLE_NAME
FROM USER_CONSTRAINTS A, USER_CONS_COLUMNS B
WHERE A.CONSTRAINT_TYPE = 'R' AND A.R_CONSTRAINT_NAME = B.CONSTRAINT_NAME AND B.TABLE_NAME = 'CUSTOMERS'

pd: cambiar 'CUSTOMERS' por el nombre de la tabla