viernes, 28 de agosto de 2009

Dar todos los privilegios a un usuario sobre un ROL

Por qué ??????? POR QUE NO PUEDO DARLE TODOS LOS PRIVILEGIOS A UN USUARIO DE UNA ?????????

Esto es una pregunta que pasa todo el tiempo!!!!

Es muy comun tener un usuario "aplicacion" donde creo todos los objetos.. es decir es el schema owner (o dueño de esquema) y luego querer que otros usuarios, usuarios de verdad, se conecten y puedan acceder a todos los objetos del usuario "aplicacion" !!!!!

Entonces porque no puedo hacer GRANT ALL schema_name TO pepe!!!!!!!

bueno... no entiendo porque pero la forma de hacerlo es darle los privs de a uno.. aca va una forma "FACIL" de hacerlo:


FOR x IN (SELECT table_name FROM dba_tables WHERE owner=<>)
LOOP
EXECUTE IMMEDIATE 'GRANT SELECT ON <>.' x.table_name ' TO <>';
END LOOP;

Luego que le dimos todos los privs a un rol...le damos ese rol al usuario que geremos
grant rol_name to usuer_name

y por utlimo.. para que el usuario no tenga que poner el nombre del esquema antes de cada tabla.. le podemos decir que el current_schema del usuario es el del usuario "aplicacion" para eso hacemos un trigger que ejecute luego que se conecte.. el famoso after_logon:

CREATE OR REPLACE TRIGGER app_user.after_logon_trg
AFTER LOGON ON app_user.SCHEMA
BEGIN
EXECUTE IMMEDIATE 'ALTER SESSION SET current_schema=SCHEMA_OWNER';
END;
/


obviamente hay gente que sabe y de alli sale la info:

http://forums.oracle.com/forums/thread.jspa?threadID=936165
http://www.oracle-base.com/articles/misc/SchemaOwnersAndApplicationUsers.php

jueves, 20 de agosto de 2009

ver script de creacion de un objeto -- dbms_metadata

Muchas veces necesitamos saber saber como crear un objeto.

Tipicamente las vistas es un objeto que comunmente queremos saber como fue creado, para saber cual es la sentencia sql que ejecuta.


para saber la sentencia ddl que permite crear un objeto se puede consular el paquete
dbms_metadata
principalmente el metodo
get_ddl. Que recibe 3 parametros (en una de sus invocaciones)

1 - tipo de objeto, en los ejemplos se muestra para los objetos TABLE y VIEW
2 - El nombre del objeto, en el ejemplo, TABLA1 y P (nombre de la vista)
3- El esquma donde se encuentra el objeto , en el ejemplo , SCOOT Y USUARIO

ES IMPORTANTE QUE TODOS LOS NOMBRES TIENEN QUE ESTAR EN MAYUSCULAS YA QUE SON STRING Y ORACLE LOS GUARDA CON MAYUSCULAS.


como es un paquete no se puede ejecutar asi nomas, hay 2 formas basicas:
cargar el resultado en la tabla DUAL:

select dbms_metadata.get_ddl('TABLE','TABLA1','SCOTT') from dual;

O hacer un script que escriba en la consola:

begin
dbms_output.put_line(dbms_metadata.get_ddl('VIEW','P','USUARIO'));
end;
/