You are on page 1of 9

El Diccionario de Datos en Oracle Oracle lo maneja a 3 niveles: Como ejemplo vamos a listar los objetos TIPO TABLA: LISTA

TODOS LOS OBJETOS A NIVEL DE USUARIO CONECTADO Y QUE ES DUEO. select * from user_tables; LISTA TODOS LOS OBJETOS A NIVEL DE USUARIO CONECTADO, QUE ES DUEO Y ADEMAS DE OTROS USUARIOS DE LOS CUALES TENGA PRIVILEGIOS LOS CUALES SE DEFINAN EN LA COLUMNA owner. select * from all_tables; LISTA TODOS LOS OBJETOS DE LA BASE DE DATOS, PARA LO CUAL SE DEBE CONECTAR CON EL USUARIO SYS SYSTEM. select * from dba_tables; Lo anterior a: user_views, user_indexes, user_constraints por ejemplo. Para visualizar todos los tipos de objetos se usa la vista USER_OBJECTS: select object_type, count(*) from user_objects ab group by object_type order by ab.OBJECT_TYPE ------------------------- ---------------------------------------------------------Tipos de Datos para columnas dinmicos
create or replace FUNCTION PAISES( idr NUMBER) RETURN varchar2 AS --declaracion correct de variables idreg hr.regions.region_id%TYPE; nomreg hr.regions.region_name%TYPE; BEGIN select r.region_id , r.region_name INTO idreg, nomreg from hr.regions r where r.region_id = idr; RETURN nomreg; END PAISES;

EJEMPLO DE UN PROCEDIMIENTO ALMACENADO


CREATE OR REPLACE PROCEDURE INSERTA_REGION ( NOMBRER IN VARCHAR2 ) AS CLAVEREGION NUMBER; AUX NUMBER; BEGIN SELECT count(*) + 1 INTO CLAVEREGION FROM HR.regions; INSERT INTO HR.regions (region_id, region_name) VALUES (claveregion, nombrer); COMMIT; EXCEPTION WHEN OTHERS THEN ROLLBACK; --VUELVE AL ESTADO ANTERIOR END INSERTA_REGION;

LLAMADA AL PROCEDIMIENTO
CALL INSERTA_REGION('NUEVA REG');

PACKAGES Primero se debe crear la especificacin del paquete:


create or replace PACKAGE PCK_EJEMPLO AS /* TAREA Introducir declaraciones de paquetes (tipos excepciones, mtodos, etc) aqu */ PROCEDURE INSERTA_REGION (NOMBRER IN VARCHAR2); FUNCTION PAISES( idr NUMBER) RETURN varchar2; END PCK_EJEMPLO;

Segundo se debe crear el cuerpo:


create or replace PACKAGE BODY PCK_EJEMPLO AS -- CUERPO DEL PAQUETE DONDE SE INCLUYE TODA -- LA LOGICA DE LAS FUNCIONES O PROCEDIMIENTOS PROCEDURE INSERTA_REGION ( NOMBRER IN VARCHAR2 ) AS -- EN UN PROCEDIMIENTO PUEDO INSERTAR, BORRAR -- ACTUALIZAR CONSULTAS CLAVEREGION NUMBER; AUX NUMBER; BEGIN SELECT count(*) + 1 INTO CLAVEREGION FROM HR.regions; -- INSERTO LOS DATOS INSERT INTO HR.regions (region_id, region_name) VALUES (claveregion, nombrer); --AUX:=4/0; COMMIT; EXCEPTION WHEN OTHERS THEN ROLLBACK; --VUELVE AL ESTADO ANTERIOR END INSERTA_REGION;

------------------------------------------------------------FUNCTION PAISES( idr NUMBER) RETURN varchar2 AS --declaracion correct de variables idreg hr.regions.region_id%TYPE; nomreg hr.regions.region_name%TYPE; BEGIN select r.region_id , r.region_name INTO idreg, nomreg from hr.regions r where r.region_id = idr; RETURN nomreg; END PAISES; END PCK_EJEMPLO;

LLAMADA A LAS FUNCIONES O PROCEDIMIENTOS DEL PAQUETE


Select PCK_EJEMPLO.Paises(2) from dual; Call PCK_EJEMPLO.inserta_region (Region Nueva);

EJEMPLO DE UN CURSOR EXPLICITO


CREATE OR REPLACE PROCEDURE RESTAINVENTARIO ( IdComp usr_ferreteria.fer_comprobante.com_id%TYPE ) AS --Cursor de los Detalles del Rol CURSOR CUR_DET_COMP IS SELECT cp.cpro_pro_id proid, prod.pro_descripcion, cdet.cdet_cantidad, prod.pro_stock FROM usr_ferreteria.fer_comprobante_detalle cdet, usr_ferreteria.fer_costo_producto cp, usr_ferreteria.fer_producto prod WHERE cp.cpro_id = cdet.cdet_cpro_id and prod.pro_id = cp.cpro_pro_id and cdet.cdet_com_id = idcomp; REG_CUR_DET_COMP CUR_DET_COMP%rowtype; BEGIN -- Abro el cursor, recorro y cierro OPEN CUR_DET_COMP; LOOP FETCH CUR_DET_COMP INTO REG_CUR_DET_COMP; EXIT WHEN CUR_DET_COMP%NOTFOUND; UPDATE usr_ferreteria.fer_producto prod SET prod.pro_stock = prod.pro_stock - REG_CUR_DET_COMP.cdet_cantidad WHERE prod.pro_id = REG_CUR_DET_COMP.proid; END LOOP; CLOSE CUR_DET_COMP; COMMIT; END RESTAINVENTARIO;

------------------------- ---------------------------------------------------------ROOLLBACK. Regresa al estado anterior cuando se produce una excepcin SET TRANSACTION inicializa una transaccin y define las caractersticas clave Este comando es utilizado para definir el inicio de una transaccin. Alguno de los efectos que se puede lograr con el set transaction es que la transaccin pueda ser definida de solo lectura (readonly). Ejemplos del uso del comando son: SET TRANSACTION READ ONLY; SET TRANSACTION READ WRITE; For update ESPERA COMO SI ESTUVIESE LA APLICACION COLGADA HASTA QUE SE REALICE COMMIT O ROLLBACK select country_id cod, country_name nom from countries pais WHERE country_id='ZM' FOR UPDATE

-- LANZA UNA EXCPECION INDICANDO EL MODO DE NO ESPERA select country_id cod, country_name nom from countries pais WHERE country_id='ZM' FOR UPDATE nowait

-- ***************BITACORA **********************l -- TABLA BITACORA para guardar los cambios en columnas que afecten LA INTEGRIDAD DE LOS DATOS -- y se deban establecer responsabilidad en los cambios realizados, con el usuario y la fecha de acceso. CREATE TABLE FER_BITACORA ( bit_id NUMBER PRIMARY KEY NOT NULL, bit_fecha VARCHAR2(20) NOT NULL, bit_usuario VARCHAR2(60) NOT NULL, bit_propietario VARCHAR2(60) NOT NULL, bit_tabla VARCHAR2(60) NOT NULL, bit_columna VARCHAR2(60) NOT NULL, bit_id_dupla NUMBER NOT NULL, bit_accion VARCHAR2(60) NOT NULL, bit_valor_anterior NUMBER, bit_valor_nuevo NUMBER); COMMIT; COMMENT ON TABLE USR_FERRETERIA.FER_BITACORA IS 'Tabla registro de la Bitacora'; COMMENT ON COLUMN USR_FERRETERIA.FER_BITACORA.bit_id IS 'Id del registro de la bitacora'; COMMENT ON COLUMN USR_FERRETERIA.FER_BITACORA.bit_fecha IS 'Fecha en que se realiz la operacin'; COMMENT ON COLUMN USR_FERRETERIA.FER_BITACORA.bit_usuario IS 'Usuario que realiza el cambio'; COMMENT ON COLUMN USR_FERRETERIA.FER_BITACORA.bit_propietario IS 'Propietario del esquema'; COMMENT ON COLUMN USR_FERRETERIA.FER_BITACORA.bit_tabla IS 'Tabla en la cual se realizaron los cambios'; COMMENT ON COLUMN USR_FERRETERIA.FER_BITACORA.bit_columna IS 'Columna en la cual se realizaron los cambios'; COMMENT ON COLUMN USR_FERRETERIA.FER_BITACORA.bit_id_dupla IS 'Primary Key de la tupla donde se realizaron los cambios'; COMMENT ON COLUMN USR_FERRETERIA.FER_BITACORA.bit_accion IS 'Accin realizada sobre la tabla'; COMMENT ON COLUMN USR_FERRETERIA.FER_BITACORA.bit_valor_anterior IS 'Valor anterior al cambio'; COMMENT ON COLUMN USR_FERRETERIA.FER_BITACORA.bit_valor_nuevo IS 'Nuevo valor realizado en la tabla';

-- TRIGGERS DE PROTECCION DE LA TABLA BITACORA -- Evita que se puedan borrar datos de la bitacora Create or replace TRIGGER TRG_BITACORA BEFORE DELETE OR UPDATE ON FER_BITACORA FOR EACH ROW BEGIN RAISE_APPLICATION_ERROR(-20020,'La actualizacin o borrado de valores de la bitacora NO est permitida'); END TRG_BITACORA; COMMIT; -- TRIGGERS DE BITACORA DE LA TABLA COMPROBANTES -- Codigo de Trigger para hacer la bitacora de la tabla fer_comprobante create or replace TRIGGER TRG_AUDITORIA_COMPROBANTE AFTER INSERT OR DELETE OR UPDATE OF com_total ON FER_COMPROBANTE FOR EACH ROW DECLARE propietario VARCHAR2(60); cantidad NUMBER; BEGIN

propietario:= sys_context('userenv','current_schema'); IF INSERTING THEN select count(*)+1 into cantidad from fer_bitacora; INSERT INTO FER_BITACORA VALUES(cantidad,TO_CHAR(SYSDATE,'DD-MM-YYYY HH:MI AM'),USER,propietario,'FER_COMPROBANTE','COM_TOTAL',:new.com_id,'INSERCION',NULL,:new.com_total); ELSIF DELETING THEN select count(*)+1 into cantidad from fer_bitacora; INSERT INTO FER_BITACORA VALUES(cantidad,TO_CHAR(SYSDATE,'DD-MM-YYYY AM'),USER,propietario,'FER_COMPROBANTE','TOTAL',:old.com_id,'BORRADO',:old.com_total,NULL); ELSIF UPDATING THEN select count(*)+1 into cantidad from fer_bitacora; INSERT INTO FER_BITACORA VALUES(cantidad,TO_CHAR(SYSDATE,'DD-MM-YYYY HH:MI AM'),USER,propietario,'FER_COMPROBANTE','TOTAL',:old.com_id,'ACTUALIZACION',:old.com_total,:new.com_total) ; END IF; END TRG_AUDITORIA_COMPROBANTE; COMMIT; -- *************** TRIGGERS DE VALIDACION ********************** -- FUNCIONES COMPLEMENTARIAS A LOS TRIGGERS. Y EJECUCION DE PROCESOS POSTERIORES

HH:MI

-- TRIGGER VALIDAR_STOCK -- Valida que existe STOCK de productos create or replace TRIGGER TRG_COMPROBAR_STOCK BEFORE INSERT OR UPDATE OF cdet_cantidad ON FER_COMPROBANTE_DETALLE FOR EACH ROW DECLARE cantidad NUMBER; stock NUMBER; comprobante NUMBER; BEGIN -- VALIDA QUE EL PRODUCTO TENGA UN COSTO SELECT count(*) INTO cantidad FROM fer_costo_producto cos WHERE cos.cpro_id=(:new.cdet_cpro_id); -- VALIDA QUE QUE EL ID COMPROBANTE EXISTA SELECT count(*) INTO comprobante FROM fer_comprobante com WHERE com.com_id=(:new.cdet_com_id); IF cantidad=0 THEN RAISE_APPLICATION_ERROR(-20003,'Error en el ID de COSTO_PRODUCTO pues no se asigno UN precio'); ELSE IF comprobante=0 THEN RAISE_APPLICATION_ERROR(-20004,'Error en el ID de COMPROBANTE pues este NO EXISTE'); ELSE IF :new.cdet_cantidad<=0 THEN RAISE_APPLICATION_ERROR(-20005,'Ingrese valores POSITIVOS MAYORES A CERO como cantidad de productos');

ELSE SELECT pro.pro_stock INTO stock FROM fer_producto pro WHERE pro.pro_id = (SELECT cos.cpro_pro_id FROM fer_costo_producto cos WHERE cos.cpro_id=(:new.cdet_cpro_id)); IF INSERTING THEN IF :new.cdet_cantidad > stock THEN RAISE_APPLICATION_ERROR(-20002,'No hay STOCK suficiente, el valor existente es: '|| stock); END IF; ELSIF UPDATING THEN stock:= stock+:old.cdet_cantidad;-- Suma el valor anterior para corregir stock existente. IF :new.cdet_cantidad > stock THEN RAISE_APPLICATION_ERROR(-20002,'No hay STOCK suficiente, el valor existente es: '|| stock); END IF; END IF; END IF; END IF; END IF; END TRG_COMPROBAR_STOCK; COMMIT; -- TRIGGER MANEJO_STOCK, actualiza el stock en funcin del nmero de items definidos en el detalle -- SE EJECUTA COMO UN PROCESO POSTERIOR A LA ACTUALIZACION DEL COMPROBANTE DETALLE create or replace TRIGGER TRG_MANEJO_STOCK AFTER INSERT OR DELETE OR UPDATE ON FER_COMPROBANTE_DETALLE FOR EACH ROW BEGIN IF INSERTING THEN UPDATE FER_PRODUCTO SET pro_stock= pro_stock-(:new.cdet_cantidad) WHERE pro_id=(SELECT cos.cpro_pro_id FROM fer_costo_producto COS WHERE cos.cpro_id=(:new.cdet_cpro_id)); ELSIF DELETING THEN UPDATE FER_PRODUCTO SET pro_stock= pro_stock+(:old.cdet_cantidad) WHERE pro_id=(SELECT cos.cpro_pro_id FROM fer_costo_producto COS WHERE cos.cpro_id=(:old.cdet_cpro_id)); ELSIF UPDATING THEN IF(:old.cdet_cantidad > :new.cdet_cantidad) THEN UPDATE FER_PRODUCTO SET pro_stock= pro_stock+(:old.cdet_cantidad-:new.cdet_cantidad) WHERE pro_id=(SELECT cos.cpro_pro_id FROM fer_costo_producto COS WHERE cos.cpro_id=(:old.cdet_cpro_id)); ELSIF(:new.cdet_cantidad > :old.cdet_cantidad) THEN UPDATE FER_PRODUCTO SET pro_stock= pro_stock-(:new.cdet_cantidad-:old.cdet_cantidad) WHERE pro_id=(SELECT cos.cpro_pro_id FROM fer_costo_producto COS WHERE cos.cpro_id=(:old.cdet_cpro_id)); END IF; END IF; END TRG_MANEJO_STOCK; COMMIT;

---------------------- ----------------------------------- ----------------------------------------------------------------------

Un Tablespace default, el cual es donde el usuario va a poder crear sus objetos por defecto, sin embargo, esto no significa que pueda crear objetos, o que tenga una cuota de espacio. Estos permisos se asignan de forma separada, salvo si utiliza el privilegio RESOURCE el que asigna una quota unlimited, incluso en el Tablespace SYSTEM! Sin embargo si esto ocurre, ud. puede posteriormente mover los objetos creados en el SYSTEM a otro Tablespace. Un Tablespace temporal, donde el usuario crea sus objetos temporales y hace los sort u ordenamientos. Un perfil o profile de usuario, que son las restricciones que puede tener su cuenta (opcional).

4. Privilegios de Sistema y de Objetos En Oracle existen dos tipos de privilegios de usuario. 4.1 System: Que permite al usuario hacer ciertas tareas sobre la BD, como por ejemplo crear un Tablespace. Estos permisos son otorgados por el administrador o por alguien que haya recibido el permiso para administrar ese tipo de privilegio. Existen como 100 tipos distintos de privilegios de este tipo. En general los permisos de sistema, permiten ejecutar comandos del tipo DDL (Data definition Language), como CREATE, ALTER y DROP o del tipo DML (Data Manipulation Language). Oracle 10g tiene mas de 170 privilegios de sistema los cuales pueden ser vistos consultando la vista: SYSTEM_PRIVILEGE_MAP Alguno privilegios ALTER ANY ASSEMBLY ALTER ANY CLUSTER ALTER ANY CUBE ALTER ANY CUBE DIMENSION ALTER ANY DIMENSION ALTER ANY EDITION ALTER ANY EVALUATION CONTEXT ALTER ANY INDEX ALTER ANY INDEXTYPE ALTER ANY LIBRARY

Crate update alter etc Entre todos los privilegios de sistema que existen, hay dos que son los importantes: SYSDBA y SYSOPER. Estos son dados a otros usuarios que sern administradores de base de datos. Para otorgar varios permisos a la vez, se hace de la siguiente manera: SQL> GRANT CREATE USER, ALTER USER, DROP USER TO ahernandez; 4.2 Object: Este tipo de permiso le permite al usuario realizar ciertas acciones en objetos de la BD, como una Tabla, Vista, un Procedure o Funcin, etc. Si a un usuario no se le dan estos permisos slo puede acceder a sus propios objetos (vase USER_OBJECTS). Este tipo de

permisos los da el owner o dueo del objeto, el administrador o alguien que haya recibido este permiso explcitamente (con Grant Option). Por ejemplo, para otorgar permisos a una tabla Ventas para un usuario particular: SQL> GRANT SELECT,INSERT,UPDATE, ON analista.venta TO jperez; Adicionalmente, podemos restringir los DML a una columna de la tabla mencionada. Si quisieramos que este usuario pueda dar permisos sobre la tabla Factura a otros usuarios, utilizamos la clusula WITH GRANT OPTION. Ejemplo: SQL> GRANT SELECT,INSERT,UPDATE,DELETE ON analista.venta TO mgarcia WITH GRANT OPTION; -- Pasa los privilegios a un tercero. 5. Asignar cuotas a Usuarios Por defecto ningun usuario tiene cuota en los Tablespaces y se tienen tres opciones para poder proveer a un usuario de una quota: 5.1Sin limite, que permite al usuario usar todo el espacio disponible de un Tablespace. 5.2 Por medio de un valor, que puede ser en kilobytes o megabytes que el usuario puede usar. Este valor puede ser mayor o nenor que el tamao del Tablespace asignado a l. 5.3 Por medio del privilegio UNLIMITED TABLESPACE, se tiene prioridad sobre cualquier cuota dada en un Tablespace por lo que tienen disponibilidad de todo el espacio incluyendo en SYSTEM y SYSAUX. No se recomienda dar cuotas a los usuarios en los Tablespaces SYSTEM y SYSAUX, pues tipicamente slo los usuarios SYS y SYSTEM pueden crear objetos en stos. Tampoco dar cuotas en los Tablespaces Temporal o del tipo Undo. 6. Roles Finalmente los Roles, que son simplemente un conjunto de privilegios que se pueden otorgar a un usuario o a otro Rol. De esa forma se simplifica el trabajo del DBA en esta tarea. Por default cuando creamos un usuario desde el Enterprise Manager se le asigna el permiso de connect, lo que permite al usuario conectarse a la BD y crear sus propios objetos en su propio esquema. De otra manera, debemos asignarlos en forma manual. Para crear un Rol y asignarlo a un usuario se hace de la siguiente manera: SQL> CREATE ROLE appl_dba; Opcionalmente, se puede asignar una clave al Rol: SQL> SET ROLE appl_dba IDENTIFIED BY app_pwd; Para asignar este Rol a un usuario: SQL> GRANT appl_dba TO jperez Otro uso comn de los roles es asignarles privilegios a nivel de Objetos, por ejemplo en una Tabla de Facturas en donde slo queremos que se puedan hacer Querys e Inserts: SQL> CREATE ROLE consulta; SQL> GRANT SELECT,INSERT on analista.factura TO consulta; Y finalmente asignamos ese rol con este perfil a distintos usuarios finales: SQL> GRANT consulta TO ahernandez; A) ******** PRIVILEGIOS SOBRE OBJETOS EN ORACLE. -- Los objetos pueden ser TABLAS, VISTAS, FUNCIONES, PROCEDIMIENTOS, PAQUETES, SECUENCIAS. -- Cualquier usuario que tenga objetos puede otorgar privilegios de objetos, y adems SYS SYSTEM. -- sintaxis para otorgar privilegios SQL> grant select, insert on usr_ferreteria.fer_comprobante to hr;

Grant succeeded -- sintaxis para quitar privilegios SQL> revoke select on usr_ferreteria.fer_comprobante from hr; Revoke succeeded -- desde hr verificar que el privilegio ha sido otorgado -- siempre debo de anteponer al objeto EL USUARIO DUEO DEL OBJETO select * from usr_ferreteria.fer_comprobante -- DAR PRIVILEGIOS PARA TODO EL MUNDO grant select on suppliers to public;

-- MANEJO DE FUNCIONES O PROCEDIMIENTOS O PAQUETES GRANT EXECUTE ON USR_FERRETERIA.VALIDA_CEDULA TO HR; B) ******** PRIVILEGIOS DEL SISTEMA EN ORACLE. -- Son privilegios que permiten alterar la configuracin de la base de datos, siempre -- El usuario SYS SYSTEM otorgan estos privilegios.

GRANT CREATE TABLESPACE TO HR; GRANT CREATE PROFILE TO HR; -- SI CORRO SIN EL PRIVILEGIO DEL SISTEMA con el usuario HR, me da el siguiente error CREATE PROFILE prf_hr LIMIT CONNECT_TIME 40 CPU_PER_CALL UNLIMITED CPU_PER_SESSION UNLIMITED IDLE_TIME 10 LOGICAL_READS_PER_CALL 2500 LOGICAL_READS_PER_SESSION 250000 PRIVATE_SGA UNLIMITED SESSIONS_PER_USER 4 COMPOSITE_LIMIT UNLIMITED ORA-01031: insufficient privileges

You might also like