Creación de Roles, permiso, crear usario en Oracle 11g

Este script crea un usuario y este puede crear otros usuario para que puede usar las tablas según el rol que se les haya dado.

--   Autor: Mynor Choc
--   Carne: 1890-09-3697
--   DBMS: Oracle 11g
--   Tema: Roles.

--creamos un table space.
CREATE BIGFILE TABLESPACE table_tarea DATAFILE 'table_tarea.dat' SIZE 100M AUTOEXTEND ON;

--creamos un usuario, desbloquemos el usuario y damos permiso de coneccion 
CREATE USER usuario_tarea  PROFILE DEFAULT IDENTIFIED BY usuario_tarea DEFAULT TABLESPACE table_tarea ACCOUNT UNLOCK;
GRANT CONNECT TO usuario_tarea;

-- permiso para crear tablas, rol, usuario y conneccion
GRANT CREATE TABLE TO usuario_tarea;
GRANT CREATE ROLE TO usuario_tarea;
GRANT CREATE USER TO usuario_tarea;
GRANT UNLIMITED TABLESPACE  TO usuario_tarea;
GRANT CREATE TO usuario_tarea with admin option;

-- habilitamos que el usuario que tenga un permiso ilimitado a la tablesspace.
ALTER USER usuario_tarea quota unlimited on table_tarea;

--conectamos a usuario_tarea
CONNECT usuario_tarea/usuario_tarea

-- creamos las tablas, llaves primarias, relaciones y los constraints

CREATE TABLE clientes
  (
    id     INTEGER NOT NULL ,
    nombre VARCHAR2 (100) NOT NULL ,
    nit    VARCHAR2 (50) NOT NULL
  ) ;
ALTER TABLE clientes ADD CONSTRAINT clientes_PK PRIMARY KEY ( id ) ;

CREATE TABLE compras
  (
    id              INTEGER NOT NULL ,
    nombre_producto VARCHAR2(100) NOT NULL ,
    inventario_id   INTEGER NOT NULL
  ) ;
ALTER TABLE compras ADD CONSTRAINT compras_PK PRIMARY KEY ( id ) ;

CREATE TABLE inventario
  (
    id                INTEGER NOT NULL ,
    nombre_inventario VARCHAR2 (100) NOT NULL
  ) ;
ALTER TABLE inventario ADD CONSTRAINT inventario_PK PRIMARY KEY ( id ) ;

CREATE TABLE productos
  (
    id             INTEGER NOT NULL ,
    nombre         VARCHAR2 (100) NOT NULL ,
    descripcion    VARCHAR2 (100) ,
    proveedores_id INTEGER NOT NULL ,
    inventario_id  INTEGER NOT NULL ,
    ventas_id      INTEGER NOT NULL
  ) ;
ALTER TABLE productos ADD CONSTRAINT productos_PK PRIMARY KEY ( id ) ;

CREATE TABLE proveedores
  (
    id     INTEGER NOT NULL ,
    nombre VARCHAR2 (100) NOT NULL
  ) ;
ALTER TABLE proveedores ADD CONSTRAINT proveedores_PK PRIMARY KEY ( id ) ;

CREATE TABLE ventas
  (
    id          INTEGER NOT NULL ,
    cantidad    VARCHAR2 (100) NOT NULL ,
    clientes_id INTEGER NOT NULL
  ) ;
ALTER TABLE ventas ADD CONSTRAINT ventas_PK PRIMARY KEY ( id ) ;

ALTER TABLE compras ADD CONSTRAINT compras_inventario_FK FOREIGN KEY ( inventario_id ) REFERENCES inventario ( id ) ;

ALTER TABLE productos ADD CONSTRAINT productos_inventario_FK FOREIGN KEY ( inventario_id ) REFERENCES inventario ( id ) ;

ALTER TABLE productos ADD CONSTRAINT productos_proveedores_FK FOREIGN KEY ( proveedores_id ) REFERENCES proveedores ( id ) ;

ALTER TABLE productos ADD CONSTRAINT productos_ventas_FK FOREIGN KEY ( ventas_id ) REFERENCES ventas ( id ) ;

ALTER TABLE ventas ADD CONSTRAINT ventas_clientes_FK FOREIGN KEY ( clientes_id ) REFERENCES clientes ( id ) ;

INSERT INTO USUARIO_TAREA.CLIENTES (ID, NOMBRE, NIT) VALUES ('1', 'Juan gomez', '455555-nk');
INSERT INTO USUARIO_TAREA.VENTAS (ID, CANTIDAD, CLIENTES_ID) VALUES ('1', '4', '1');
INSERT INTO USUARIO_TAREA.PROVEEDORES (ID, NOMBRE) VALUES ('1', 'coka-cola');
INSERT INTO USUARIO_TAREA.INVENTARIO (ID, NOMBRE_INVENTARIO) VALUES ('1', 'Finca el zapote');
INSERT INTO USUARIO_TAREA.PRODUCTOS (ID, NOMBRE, DESCRIPCION, PROVEEDORES_ID, INVENTARIO_ID, VENTAS_ID) VALUES ('1', 'Bebida coka', '12 onza', '1', '1', '1');
INSERT INTO USUARIO_TAREA.COMPRAS (ID, NOMBRE_PRODUCTO, INVENTARIO_ID) VALUES ('1', 'coka-cola', '1');

-- creamos los roles 
CREATE ROLE cajero;
CREATE ROLE supervisor;
CREATE ROLE enc_compras;
CREATE ROLE jefe_compras;

-- permiso para el cajero
GRANT SELECT ON productos TO cajero;
GRANT SELECT,INSERT ON ventas TO cajero;
GRANT UPDATE ON inventario TO cajero;
GRANT UPDATE,SELECT,DELETE ON clientes TO cajero;

-- permiso para el supervisor
GRANT SELECT ON productos TO supervisor;
GRANT DELETE,UPDATE,SELECT,INSERT ON ventas TO supervisor;
GRANT UPDATE,SELECT,DELETE ON clientes TO supervisor;

--Permiso para el enc_compras
GRANT SELECT ON proveedores TO enc_compras;
GRANT INSERT,DELETE,UPDATE,SELECT ON productos TO enc_compras;
GRANT SELECT,INSERT ON compras TO enc_compras;

--permiso para el jefe_compras
GRANT enc_compras TO jefe_compras;
GRANT DELETE,UPDATE ON compras TO jefe_compras;
GRANT INSERT,SELECT,DELETE,UPDATE ON proveedores TO jefe_compras;

--creamos los usuarios 4 usuarios.
--usuario_cajero;
--usuario_supervisor;
--usuario_enc_compras;
--usuario_jefe_compras
CREATE USER usuario_cajero  PROFILE DEFAULT IDENTIFIED BY usuario_cajero DEFAULT TABLESPACE table_tarea ACCOUNT UNLOCK;
GRANT CONNECT TO usuario_cajero;

CREATE USER usuario_supervisor  PROFILE DEFAULT IDENTIFIED BY usuario_supervisor DEFAULT TABLESPACE table_tarea ACCOUNT UNLOCK;
GRANT CONNECT TO usuario_supervisor;

CREATE USER usuario_enc_compras  PROFILE DEFAULT IDENTIFIED BY usuario_enc_compras DEFAULT TABLESPACE table_tarea ACCOUNT UNLOCK;
GRANT CONNECT TO usuario_enc_compras;

CREATE USER usuario_jefe_compras  PROFILE DEFAULT IDENTIFIED BY usuario_jefe_compras DEFAULT TABLESPACE table_tarea ACCOUNT UNLOCK;
GRANT CONNECT TO usuario_jefe_compras;

-- damos los permisos a cada usuario utilizaremos cada rol
-- ROLE cajero;
-- ROLE supervisor;
-- ROLE enc_compras;
-- ROLE jefe_compras;
GRANT cajero TO usuario_cajero;
GRANT supervisor TO usuario_supervisor;
GRANT enc_compras TO usuario_enc_compras;
GRANT jefe_compras TO usuario_jefe_compras;


-- esto puede ver que roles tiene un que nos conectemos
select * from user_role_privs;

-- nos conectamos a usuario.
-- Podemos hacer las pruebas para cada usuario y vermos que solo tenemos acceso
-- a las tablas por medio del rol.
CONNECT usuario_cajero/usuario_cajero;

select * from user_role_privs;
select * from usuario_tarea.compras; --Esta tabla no existe ya que no tenemos acceso a ella por el rol.
-- en esta caso probamos la tabla de producto, y esto solo tiene acceso sobre select ya que asi esta en el rol
select * from usuario_tarea.productos; -- el rol cajero puede selecionar esta tabla.
DELETE FROM usuario_tarea.productos WHERE id = 1; -- no tenemos privilegios para eliminar.
UPDATE usuario_tarea.productos  SET nombre = 'hola'   WHERE id = 1; -- no tenemos privilegios para actualizar
INSERT INTO usuario_tarea.PRODUCTOS(ID, NOMBRE , DESCRIPCION , PROVEEDORES_ID ,   VENTAS_ID ,   INVENTARIO_ID) VALUES  (1,'hola','otros',1,1,1); -- no tiene privilegios para insertar
--tabla ventas
INSERT INTO USUARIO_TAREA.VENTAS (ID, CANTIDAD, CLIENTES_ID) VALUES ('2', '5', '1'); -- esta tabla si puede insertar ya que es el unico que esta permitido en rol del cajero.
exit;

CONNECT usuario_supervisor/usuario_supervisor;
select * from user_role_privs;
exit;

CONNECT usuario_enc_compras/usuario_enc_compras;
select * from user_role_privs;
exit;

CONNECT usuario_jefe_compras/usuario_jefe_compras
select * from user_role_privs;
exit;

Procedure en oracle 11g con WHEN NO_DATA_FOUND exepciones

Ejercicio No.1

Crear un procedimiento con el nombre de Actualiza_Saldo, el cual deberá permitir actualizar el saldo de una cuenta, la tabla se llama: Saldos_Cuentas y contiene los siguientes campos: Saldo de tipo numérico, Fecha_Actualizacion tipo date y Co_Cuenta (número de cuenta) de tipo numérico. El procedimiento debe permitir enviar el número de cuenta y saldo como parámetros para su búsqueda y actualización, así mismo la fecha de actualización debe ser actualizada con la fecha del sistema.

CREATE TABLE Saldos_Cuentas
(
Saldo INTEGER ,
Fecha_Actualizacion DATE ,
Co_Cuenta INTEGER NOT NULL
);
ALTER TABLE Saldos_Cuentas ADD CONSTRAINT Saldos_Cuentas_PK PRIMARY KEY ( Co_Cuenta ) ;


Insert into SALDOS_CUENTAS (SALDO,FECHA_ACTUALIZACION,CO_CUENTA) values (333,to_date('11/08/15','DD/MM/RR'),3);
Insert into SALDOS_CUENTAS (SALDO,FECHA_ACTUALIZACION,CO_CUENTA) values (33333,to_date('12/08/15','DD/MM/RR'),4);

CREATE OR REPLACE PROCEDURE Actualiza_Saldo(Cuentabuscar INTEGER,nuevosaldo INTEGER)
AS
BEGIN
UPDATE SALDOS_CUENTAS SET saldo= nuevosaldo, FECHA_ACTUALIZACION = SYSDATE
WHERE CO_CUENTA=Cuentabuscar;
END;

SELECT * FROM SALDOS_CUENTAS;

EXEC ACTUALIZA_SALDO(3,4443333)

SELECT * FROM SALDOS_CUENTAS;

Ejercicio No. 2

Crear un procedimiento con el nombre de Ver_departamento, el cual debe permitir enviar como parámetro el número de departamento a través de la variable numdepart de tipo numérico, se debe de declarar las variables v_dnombre tipo varchar2 de 14 posiciones y localidad tipo varchar2 de 14 posiciones. El procedimiento debe realizar una consulta en la tabla depart la cual contiene los siguientes campos: dnombre(nombre del departamento), loc(localidad) y depot_no(número de departamento), la consulta se ejecutara a través del numdepart que se envía como parámetro, en caso de encontrar el número de departamento deberá de mostrar a través de un DBMS_OUTPUT el número de departamento con el nombre del mismo y su localidad, si no encontrase el departamento se debe de levantar la exception WHEN NO_DATA_FOUND, mostrando por medio de un DBMS_OUTPUT que no encontró el departamento.

CREATE TABLE depart
(
dnombre varchar2(14) ,
loc varchar2(14) ,
depot_no INTEGER NOT NULL
);
ALTER TABLE depart ADD CONSTRAINT depart_PK PRIMARY KEY ( depot_no );

create or replace PROCEDURE Ver_departamento(numdepart INTEGER)
is
v_dnombre varchar2(14);
localidad varchar2(14);
BEGIN
SELECT dnombre into v_dnombre
FROM depart
WHERE depot_no = numdepart;
DBMS_OUTPUT.PUT_LINE('Numero de departamento: '|| numdepart);
DBMS_OUTPUT.PUT_LINE('Nombre: ' || v_dnombre);
DBMS_OUTPUT.PUT_LINE('localidad: ' || localidad);
EXCEPTION
WHEN no_data_found THEN
dbms_output.put_line('No se encontro ningun departamento');
WHEN others THEN
dbms_output.put_line('Ha ourrido un error!');
END;
exec Ver_departamento(2)

Consultas tabla empleado y departamentos

1. Obtener todos los datos de los empleados cuyos apellidos sean López o Pérez.

SELECT *
FROM empleados
WHERE apellidos = lower('lopez') OR apellidos = lower('perez')

2. Obtener Todos los datos de los Empleados cuyos apellidos empiecen con P.

SELECT *
FROM empleados
WHERE apellidos like lower('P%')

3. Obtener número de Empleados de cada departamento.

SELECT depa.nombre AS "Departamento", COUNT(emple.dni) AS "Total de empleados"
FROM empleados emple INNER JOIN departamentos depa
ON (emple.departamento = depa.codigo)
GROUP BY depa.nombre;

4. Obtener los Nombres y Apellidos de los empleados que trabajen en departamentos cuyo presupuesto sea mayor a Q. 60,000.00

SELECT emple.nombre ||' '|| emple.apellidos AS "nombre del empleado"
FROM empleados emple
WHERE departamento
IN(SELECT codigo FROM departamentos WHERE presupuesto > 60000)

5. Obtener los Nombres de los departamentos que tienen más de 2 empleados.

SELECT depa.nombre AS "Departamento"
FROM empleados emple INNER JOIN departamentos depa
ON (emple.departamento = depa.codigo)
GROUP BY depa.nombre
having COUNT(emple.dni)>2;

6. Despedir a todos los empleados que trabajen en el departamento de informática el cual el código es 14.

DELETE
FROM empleados
WHERE departamento = 14

base de datos:

--Autor: mchoccac
--en:2015-07-28
--DBMS:Oracle Database 11g

CREATE TABLE departamentos
(
codigo INTEGER NOT NULL ,
nombre NVARCHAR2 (100) ,
presupuesto INTEGER
);
ALTER TABLE departamentos ADD CONSTRAINT departamentos_PK PRIMARY KEY ( codigo ) ;

CREATE TABLE empleados
(
dni VARCHAR2 (8) NOT NULL ,
nombre NVARCHAR2 (100) ,
apellidos NVARCHAR2 (255) ,
departamento INTEGER NOT NULL
);
ALTER TABLE empleados ADD CONSTRAINT empleados_PK PRIMARY KEY ( dni ) ;
ALTER TABLE empleados ADD CONSTRAINT empleados_departamentos_FK FOREIGN KEY ( departamento ) REFERENCES departamentos ( codigo ) ;

Insert into DEPARTAMENTOS (CODIGO,NOMBRE,PRESUPUESTO) values (14,'informatica',50000);
Insert into DEPARTAMENTOS (CODIGO,NOMBRE,PRESUPUESTO) values (23,'tecnologia',200000);
Insert into DEPARTAMENTOS (CODIGO,NOMBRE,PRESUPUESTO) values (34,'talento',333333333);

Insert into EMPLEADOS (DNI,NOMBRE,APELLIDOS,DEPARTAMENTO) values ('222','maria','lopez',34);
Insert into EMPLEADOS (DNI,NOMBRE,APELLIDOS,DEPARTAMENTO) values ('363d','angel','mendez',34);
Insert into EMPLEADOS (DNI,NOMBRE,APELLIDOS,DEPARTAMENTO) values ('123','mynor','choc',14);
Insert into EMPLEADOS (DNI,NOMBRE,APELLIDOS,DEPARTAMENTO) values ('334','victor','choc',14);
Insert into EMPLEADOS (DNI,NOMBRE,APELLIDOS,DEPARTAMENTO) values ('e233','ana','ana',23);
Insert into EMPLEADOS (DNI,NOMBRE,APELLIDOS,DEPARTAMENTO) values ('233','juan','perez',23);
Insert into EMPLEADOS (DNI,NOMBRE,APELLIDOS,DEPARTAMENTO) values ('22','armando','lopez',14);

tabla de empleado y departamento

Compile and Create Postgres driver for Qt5 on Android android_armv5, android_armv7 and android_x86.

Compilacion y creacion Postgres driver para Qt5 para android:  android_armv5, android_armv7 y android_x86.

Compile and Create Postgres driver for Qt5 on Android android_armv5, android_armv7 and android_x86.

Comparto este script en “sh” para que se le sea fácil crear el driver android qt, cualquier sugerencia favor de comentar.

Share this script in “sh” that will be easy to create the android qt driver, any suggestions for comment.

Adjunto el script y readme en inglés y español.
Attached the script and readme in English and Spanish.
link v1: driverPostgresQtAndroid 32 bits obsoleto and obsolete

Soporte para 32 y 64 bits.
link v2: driverPostresQtAndroid

Test drivers: TestDriversPruebaDrivers

pass: http://mynorrene.choccac.com
Create by Choc Cac, R Mynor.

Compile and Create MySQL driver for Qt5 on Android android_armv5, android_armv7 and android_x86.

Compilacion y creacion MySQL driver para Qt5 para android:  android_armv5, android_armv7 y android_x86.

Compile and Create MySQL driver for Qt5 on Android android_armv5, android_armv7 and android_x86.

Comparto este script en “sh” para que se le sea fácil crear el driver android qt, cualquier sugerencia favor de comentar.

Share this script in “sh” that will be easy to create the android qt driver, any suggestions for comment.

Adjunto el script y readme en inglés y español.

Attached the script and readme in English and Spanish.

 link 1: driverMysqlQtAndroid 32 bits. obsoleto and obsolete
Soporte para plaforma de 32 o 64 bits.
pass: http://mynorrene.choccac.com
Create by Choc Cac, R Mynor.

Lectura serial de una entrada digital Ejercicio 1

 

/*
Una empresa de gaseosas tiene un sistema con dos
sensores, uno de ellos indica si la botella se ha llenado
con el líquido y el otro sensor indica si la botella
ya tiene la tapa. Para este caso simularemos los dos
sensores por medio de dos pulsadores (S1 y S2).

La rutina se describe de esta manera: si la botella se
llena de manera adecuada (se debe activar S1 y
mostrar por consola "Gaseosa llena" luego de ello
si tiene la tapa colocada (se debe activar S2 y mostrar por consola
"Gaseosa tapada"), al finalizar el proceso se debe encender un LED
que indica que el proceso terminó bien y además se debe mostrar
un mensaje por la consola "Gaseosa bien empacada". Recuerda
que primero se debe activar S1 y luego S2 para que le proceso sea válido.
*/

int pulsador2=2;
int pulsador3=3;
int led4=4;
boolean estado_1 = false;
boolean estado_2 = false;

void setup()
{
    pinMode(pulsador2, INPUT);  
    pinMode(pulsador3, INPUT);
    pinMode(led4,OUTPUT);
    Serial.begin(9600);
}

void loop()
{
    if (digitalRead(pulsador2)==LOW)
    {
        estado_1 = true;    
    }
    
    while(estado_1 == true)
    {
        Serial.println("=>Gaseosa llena");
        delay(1);   
        if(digitalRead(pulsador3)==LOW)
        {
                estado_2 = true;
                Serial.println("..Gaseosa tapada");
        }
        
        if(estado_2 == true)
        {
                estado_1 = false;
                estado_2 = false;
                Serial.println("##Gaseosa bien empacada");
                digitalWrite(led4,HIGH);
                delay(3000);
        }
    }
    digitalWrite(led4,LOW);
}

 

Encender un LED con un pulsador Ejercicio 2

/*
Tu padre quiere que realices un sistema de iluminación LED para
las escaleras de la casa. La condición es que si estás arriba y
pulsas a S1 o si estás abajo y pulsas S2 el LED Rojo se enciende y
al dejar de pulsar se apaga. Como guía de montaje toma la 
imagen anterior.
*/

int pulsador2=2;
int pulsador3=3;
int led4=4;
 
void setup()
{
    pinMode(pulsador2, INPUT);  
    pinMode(pulsador3, INPUT); 
    pinMode(led4,OUTPUT);
}

void loop()
{
    if ((digitalRead(pulsador2)==LOW) || (digitalRead(pulsador3)==LOW))
    {
    digitalWrite(led4,HIGH); 
    }else{
        digitalWrite(led4,LOW); 
        }
}

 

Encender un LED con un pulsador Ejercicio 1

/*
La multinacional francesa Flante experta en maquinaria industrial 
te ha contratado para que automatices una máquina cortadora de papel. 
La condición  principal es que el operario de la máquina cuando vaya a realizar 
el corte siempre mantenga las dos manos ocupadas, esta es una regla de 
seguridad industrial para evitar accidentes. El operario debe oprimir los dos 
pulsadores uno con cada mano y la cuchilla cortadora debe bajar y hacer el corte. 
El siguiente montaje simula el control de la máquina, los dos pulsadores (S1 y S2)
y el LED rojo simula la cuchilla cortadora.
*/

int pulsador2=2;
int pulsador3=3;
int led4=4;
 
void setup()
{
    pinMode(pulsador2, INPUT);  
    pinMode(pulsador3, INPUT); 
    pinMode(led4,OUTPUT);
}

void loop()
{
    if ((digitalRead(pulsador2)==LOW) && (digitalRead(pulsador3)==LOW))
    {
    digitalWrite(led4,HIGH); 
    }else{
        digitalWrite(led4,LOW); 
        }
}

 

Ejercicio Hola mundo LED Ejercicio_3

/*

Un Strober es un bombillo que prende y apaga muy rápido,
muy usado en las fiestas, tu misión es realizar tu strober
casero con un LED, con el mismo esquema montado en este
tutorial.

*/

// Identificador  el pin 2
int pin2 = 2;

// pausar por 3 segundos
int tiempo = 150;
void setup()
{
    // Asignar el pin 2 como una salida
    pinMode(pin2,OUTPUT); 
}

void loop()
{
    digitalWrite(pin2,HIGH); // Enciende el LED
    delay(tiempo);
    digitalWrite(pin2,LOW); // Apaga el LED
    delay(tiempo);
}

 

Ejercicio Hola mundo LED Ejercicio_2

/*
La empresa de automatización NRJ Inc. te contrata para hacer un montaje de
un LED Intermitente en una placa Arduino UNO, con el único requisito de que
el LED debe estar ubicado en el Pin 5, ellos muy amablemente te han facilita-
do el esquema, tu tarea es:

A) Realizar el montaje y la respectiva programación de 2 segundos prendido y
1 segundo apagado


*/

// Identificador  el pin 2
int pin2 = 2;

void setup()
{
    // Asignar el pin 2 como una salida
    pinMode(pin2,OUTPUT); 
}

void loop()
{
    digitalWrite(pin2,HIGH); // Enciende el LED
    delay(2000);
    digitalWrite(pin2,LOW); // Apaga el LED
    delay(1000);
}