Sie sind auf Seite 1von 12

Acceso a datos

-usuario: nombre que identifica a alguien que tiene alguna posibilidad de algn permiso para
hacer algo.
-En mysql al contrario que en otros gestores estndares el uso est referido a un usuario
asociado a un equipo (user@host).
cuando pongamos un dato el cual sea especial pondremos este entre comillas para
asegurarnos de que se interpreta.
un permiso es la capacidad de realizar alguna accin sobre un recurso, se crean usuario y se le
dan o se le quitan permisos.
root es el superusuario.
para crear un usuario la sintaxis es:
create user //usuario//;
create user //usuario// identified by 'contrasea';
create user //usuario identified by password (la contrasea no aparece encriptada)
como borrar un usuario
drop user //usuario
como identificarse
mysql -u usuario -p(si este tiene clave)
para ver el usuario actual
select user();
select current_user();
select current_user;
toda la informacion esta interna en una base de datos llamada mysql. esta base de datos no
tiene que ser modificada por el usuario sino por el sistema en s.
sintaxis grant y revoke
grant <privilegios> on <recursos> to <usuario>;
para poder dar persmisos se se le aada 'with grant option' ese usuario puede concederlos a
un tercero
to <lista usuarios> with grant option
par quitar permisos
revoke <listaprivilegio> on <lista recursos> to <lista usuarios>
Los permisos pueden darse en varios niveles:
Nivel global
Los permisos globales se aplican a todas las bases de datos de un servidor dado. Estos
permisos
se almacenan en la tabla mysql.user. GRANT ALL ON *.* y REVOKE ALL ON *.*
otorgan y
quitan slo permisos globales.
Nivel de base de datos
Los permisos de base de datos se aplican a todos los objetos en una base de datos dada.
Estos
permisos se almacenan en las tablas mysql.db y mysql.host . GRANT ALL ON
db_name.* y
REVOKE ALL ON db_name.* otorgan y quitan slo permisos de bases de datos.
Nivel de tabla
Los permisos de tabla se aplican a todas las columnas en una tabla dada. Estos permisos se
almacenan en la tabla mysql.tables_priv . GRANT ALL ON db_name.tbl_name y
REVOKE
ALL ON db_name.tbl_name otorgan y quian permisos slo de tabla.
Nivel de columna
Los permisos de columna se aplican a columnas en una tabla dada. Estos permisos se
almacenan
en la tabla mysql.columns_priv . Usando REVOKE, debe especificar las mismas columnas
que
se otorgaron los permisos.
Nivel de rutina
Los permisos CREATE ROUTINE, ALTER ROUTINE, EXECUTE, y GRANT se aplican a rutinas
almacenadas. Pueden darse a niveles global y de base de datos. Adems, excepto para
CREATE
ROUTINE, estos permisos pueden darse en nivel de rutinas para rutinas individuales y se
almacenan
en la tabla mysql.procs_priv .

ej grant all privileges on *.* (significado de los asteriscos y el punto *BD(bases) . *T(tablas))
ejercicio
crear usuario dba con passwor dba y le damos permisos globales a este usuario.
grant all privileges on *.* to dba
crear un usuario pepe desde dba y le ponemos contrasea pepe.
show grants; muestra los privilegios concedidos al usuario actual.
show grants for usuario; muestra los privilegios del usuario que seleccionemos a ver.
crear usuario pepe y darle privilegiso de solo ver el contenido de la tabla products de la bd
classicmodels
create user pepe identified by 'pepe';
grant select on classicmodels.products to pepe@localhost;
actividades en clase
crear usuario u con pass u
create user u identified by 'u';
asignarle todos los privilegios a nivel global
grant all privileges on *.* to u;
nos conectamos y mostramos sus privilegios de u
mysql -u u -p
show grants;
creamos una segunda cuenta
create user u@locahost identified by 'u';
mostramos los usuarios;
use mysql;
select User, Host from user;
eliminamos u
drop user u;
crear usuario y asignarle privilegios sobre una bd
create user prueba identified by 'prueba';
grant all privileges on classicmodels.* to prueba;
mysql -u prueba -p
show databases;
seleccionamos la bd
use classicmodels;
show tables;
mostroamos privilegios
show grants;
quitamos los permisos a un usuario
revoke ALL on *.* from usuario;
dar permiso para seleccionar e insertar registros sobre la tabla customers
grant SELECT, INSERT on classicmodels.customers to usuario;
comprobar que el usuario u puede conceder permisos al usuario k
grant grant option, insert, select on classicmodels.products to usuario;
quitarle a un usuario todos los privilegios (incluido el asignar privilegios)
revoke all privileges, grant option from usuario;
conceder permiso a un usuario el privilegio de seleccioar customerNAme y el telefono.
grant select (customerName, phone) on classicmodels.customers to iban;
revocar uno de ellos.
revoke select (phone) on classicmodels.customers to iban;
queremos conceder permisos a nivel de columna direrentes permisos sobre diferentes
columnas de diferentes tablas de diferentes bases de datos y esto a distintos usuarios.
LISTA PAGINA 717 DEL REF DE MYSQL DE LA CARPETA bd DE 1 DAM

flush : comando de recarga de datos, (flush privileges) recarga la lista de permisos.
sentencia rename
rename //anterior nombre to //nombre nuevo;
rename pingu to pin;
cambiar clave al usuario pingu
set password for pingu = password ('patata');

crear usuario desarrollador con permiso para crear y ejecutar codigo solo en la classicmodels
select, insert, update, y delete
create user usuario identified by 'user';
grant GRANT OPTION, INSERT, UPDATE, DELETE, SELECT, EXECUTE, CREATE ROUTINE, ALTER
ROUTINE on classicmodels.* to user;
ALTER ROUTINE (permite modificar codigo).
mysql permite la escritura de codigo de procedimiento y funciones escrito en sql que permiten
ser invocados y ejecutados en el servidor.
ventajas
es mas eficiente por que reduce el trafico entre servidor y cliente.
permite construir aplicaciones conforme a un conjunto de instrucciones.
razones de integridad de los datos, no dejamos que los usuarios tomen cuenta en esos datos
para asi no limitar el uso.
crear procedimiento
create procedure.
los procedimientos son objetos de la base de datos(puedo tener distintos procedimientos en
distintas BD).
soporta directamente el uso de select como si fuesen invocadas en modo interpretado (como
si lo introdujese yo)
ejemplo create procedure nombre()
los parametros son:
- de entrada (in x varchar(15))
-de salida out y DECIMAL
- o de entrada - salida (in x varchar(15), out y decimal)
(in, out, inout)
durante el tiempo de edicion, cambiamos provisionalmente el delimitador
esto se hace con DELIMITER // o lo que querramos poner como delimitador

ejemplo create procedure p()
begin
select * from agenda;
select * from clase;
select * from asicnatura;
end//
ejercicio
procedimiento que liste los codigos y los precios de una famila dada, esta familia se le pasara
create procedure ejemplo3(in x varchar(50))
begin
select productLine, productCode from products join productlines using(productLine) where
productLine=x;
end //
una variable de usuario se nombra con el formato @nombre si no esta inicializada vale null
las variables se borran cuando se sale de la sesion.
y pueden ser asignadas por el comando set
set @nombre=expresion;
call ejemplo2(@x);
ejercicio que muestra el elmpleado y su telefono de oficina
create procedure ejemplo4(in x int(11))
begin
select firstName, lastName, phone from employees join offices using(officeCode) where
employeeNumber=x;
end //
set @x=1002;
call ejemplo4(@x);
ejercicio que imprima el valor total de un pedido 10101
create procedure actividad(in x int(11))
begin
select sum(priceEach * quantityOrdered) total from orderdetails where orderNumber=x;
end //
set @x=10101;
call actividad(@x);

19.2.9.1. Declarar variables locales con DECLARE
DECLARE var_name[,...] type [DEFAULT value]
Este comando se usa para declarar variables locales. Para proporcionar un valor por defecto
para la
variable, incluya una clusula DEFAULT . El valor puede especificarse como expresin, no
necesita ser
una constante. Si la clusula DEFAULT no est presente, el valor inicial es NULL.
La visibilidad de una variable local es dentro del bloque BEGIN ... END donde est
declarado.
Puede usarse en bloques anidados excepto aqullos que declaren una variable con el mismo
nombre.

Un cursor es un tipo de variable (necesita ser declarada) especial porque es una variable
multilinea, es decir, contiene lo que devuelve la select (Lo mismo que un resulset en java).
Necesitan ser declarados, abiertos, leerlos lnea a lnea y cerrarlos.

El contenido de un cursor ser el resultado de una select y se asigna en la declaracin de la
variable cursor.
19.2.11.1. Declarar cursores
DECLARE cursor_name CURSOR FOR select_statement
Este comando declara un cursor. Pueden definirse varios cursores en una rutina, pero cada
cursor en
un bloque debe tener un nombre nico.
El comando SELECT no puede tener una clusula INTO .
19.2.11.2. Sentencia OPEN del cursor
OPEN cursor_name
Este comando abre un cursor declarado prviamente.
19.2.11.3. Sentencia de cursor FETCH (next de java)
FETCH cursor_name INTO var_name [, var_name] ...
Este comando trata el siguiente registro (si existe) usando el cursor abierto que se especifique,
y
avanza el puntero del cursor.
Si no existen ms registros disponibles, ocurrir una condicin de Sin Datos con el valor
SQLSTATE 02000. Puede configurar un manejador (handler) para detectar esta condicin (o
para una condicin
NOT FOUND). Vea un ejemplo en la seccin Seccin 19.2.11, Cursores.

La sintaxis de fetch es nombre del cursor into nombre de variables, estas variables tienen que
coincidir con nombre, tipo y orden con la declaracin de la select del cursor
Hace una lectura de una sola lnea.

19.2.11.4. Sentencia de cursor CLOSE
CLOSE cursor_name
Este comando cierra un cursor abierto prviamente.
Si no se cierra explcitamente, un cursor se cierra al final del comando compuesto en que se
declara.


19.2.10.2. DECLARE handlers
DECLARE handler_type HANDLER FOR condition_value[,...] sp_statement
handler_type:
CONTINUE
| EXIT
| UNDO
condition_value:
SQLSTATE [VALUE] sqlstate_value
| condition_name
| SQLWARNING
| NOT FOUND
| SQLEXCEPTION
| mysql_error_code
Este comando especifica handlers que pueden tratar una o varias condiciones. Si una de estas
condiciones ocurren, el comando especificado se ejecuta.
Para un handler CONTINUE , contina la rutina actual tras la ejecucin del comando del
handler. Para un handler EXIT , termina la ejecucin del comando compuesto BEGIN...END
actual. El handler de tipo UNDO todava no se soporta.
NOT FOUND es una abreviacin para todos los cdigos SQLSTATE que comienzan con 02.


Un Manejador de tipo continue lo que hace es que si detecta una condicin predeterminada
(por ejemplo un fetch sin datos) entonces lo que vamos a hacer es cambiar el estado de una
variable. Esto lo que hace es ejecutar la sentencia de la sentencia del handler y seguir el
procedimiento normal.

Un manejador de tipo exit ejecuta la sentencia del handler y sale del procedimiento.

El orden de declaracin (si existe) es el siguiente:
1. Condiciones y variables
2. Cursores
3. Handlers
El esquema de lectura adelantada es lee, procesa y vuelve a leer. (fetch,while,fetch)













Escribir un procedimiento que construya un cursor con el n del cliente, el nombre del cliente y
el n de pedidos que ha realizado. Queremos recorrer el cursor y que escriba el contenido del
cursor en una tabla.
DROP PROCEDURE IF EXISTS clientesPed;

DELIMITER //
CREATE PROCEDURE clientesPed()
BEGIN
DECLARE hecho bool DEFAULT false;
DECLARE a,c INT;
DECLARE b VARCHAR(50);
DECLARE clientesPedidos CURSOR FOR
select
customerNumber,
customerName,
count(orderNumber) pedidos
from customers
join orders using(customerNumber)
group by customerNumber;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET hecho= true;

DROP TABLE IF EXISTS clientpedid;
CREATE TABLE clientpedid (cutomerNumber INT,
customerName VARCHAR(50),
pedidos INT);
OPEN clientesPedidos;

FETCH clientesPedidos INTO a,b,c;
WHILE NOT hecho DO
INSERT INTO clientPedid VALUES (a,b,c);
FETCH clientesPedidos INTO a,b,c;
END WHILE;
CLOSE clientesPedidos;
END//

DELIMITER ;


Hacer un procedimiento sin cursores que haga el procedimiento anterior pero sin usar
cursores

DROP PROCEDURE IF EXISTS clientesPed2;

DELIMITER //
CREATE PROCEDURE clientesPed2()
BEGIN
select
customerNumber,
customerName,
count(orderNumber) pedidos
from customers
join orders using(customerNumber)
group by customerNumber;


DROP TABLE IF EXISTS clientpedid;
CREATE TABLE clientpedid (cutomerNumber INT,
customerName VARCHAR(50),
pedidos INT);
INSERT INTO clientpedid
select
customerNumber,
customerName,
count(orderNumber) pedidos
from customers
join orders using(customerNumber)
group by customerNumber;

END//

DELIMITER ;

Hacer un procedimiento al que se le va a pasar como parmetro el nombre del pas y este haga
un cursor con los clientes de ese pas junto con el nmero de pedidos que ha realizado cada
uno de esos clientes. Cuando se ejecute el procedimiento vamos a verter el contenido del
cursor a una tabla de salida que deber resetearse en cada ejecucin


Queremos modificar la tabla de salida donde queremos que aparezca la catalogacin del
cliente(Especial, normal y lowCost) un cliente es especial si la suma de sus pedidos tiene un
valor de un 50% superior a la media de los pedidos de su pas, y si esta por debajo de la media
un 50% del valor.


Un trigger es una accin que se dispara automticamente cuando se produce un evento
asociado con una accin de modificacin de una tabla
Todos los triggers en mysql estn asociados a una tabla. Cada tabla puede tener asociados sus
propios trigers.
momento_disp es el momento en que el disparador entra en accin. Puede ser BEFORE
(antes) o
AFTER (despues), para indicar que el disparador se ejecute antes o despus que la sentencia
que lo
activa.
evento_disp indica la clase de sentencia que activa al disparador. Puede ser INSERT,
UPDATE, o
DELETE. Por ejemplo, un disparador BEFORE para sentencias INSERT podra utilizarse para
validar los
valores a insertar.
No puede haber dos disparadores en una misma tabla que correspondan al mismo momento y
sentencia. Por ejemplo, no se pueden tener dos disparadores BEFORE UPDATE. Pero s es
posible
tener los disparadores BEFORE UPDATE y BEFORE INSERT o BEFORE UPDATE y AFTER
UPDATE.
sentencia_disp es la sentencia que se ejecuta cuando se activa el disparador. Si se
desean
ejecutar mltiples sentencias, deben colocarse entre BEGIN ... END, el constructor de
sentencias
compuestas. Esto adems posibilita emplear las mismas sentencias permitidas en rutinas
almacenadas. Consulte Seccin 19.2.7, Sentencia compuesta BEGIN ... END.
Note: Antes de MySQL 5.0.10, los disparadores no podan contener referencias directas a
tablas por
su nombre. A partir de MySQL 5.0.10, se pueden escribir disparadores como el llamado
testref.

En un trigger no se puede llamar a otro procedimiento.


Las columnas de la tabla asociada con el disparador pueden referenciarse empleando los alias
OLD y NEW. OLD.nombre_col hace referencia a una columna de una fila existente, antes de
ser
actualizada o borrada. NEW.nombre_col hace referencia a una columna en una nueva fila a
punto de
ser insertada, o en una fila existente luego de que fue actualizada.
El uso de SET NEW.nombre_col = valor necesita que se tenga el privilegio UPDATE
sobre la
columna. El uso de SET nombre_var = NEW.nombre_col necesita el privilegio SELECT
sobre la
columna.
Nota: Actualmente, los disparadores no son activados por acciones llevadas a cabo en
cascada por
las restricciones de claves extranjeras. Esta limitacin se subsanar tan pronto como sea
posible.
La sentencia CREATE TRIGGER necesita el privilegio SUPER. Esto se agreg en MySQL 5.0.2.

Tambin hay limitaciones sobre lo que puede aparecer dentro de la sentencia que el disparador
ejecutar al activarse:
El disparador no puede referirse a tablas directamente por su nombre, incluyendo la misma
tabla
a la que est asociado. Sin embargo, se pueden emplear las palabras clave OLD y NEW. OLD
se
refiere a un registro existente que va a borrarse o que va a actualizarse antes de que esto
ocurra.
NEW se refiere a un registro nuevo que se insertar o a un registro modificado luego de que
ocurre la
modificacin.
El disparador no puede invocar procedimientos almacenados utilizando la sentencia CALL.
(Esto
significa, por ejemplo, que no se puede utilizar un procedimiento almacenado para eludir la
prohibicin de referirse a tablas por su nombre).
El disparador no puede utilizar sentencias que inicien o finalicen una transaccin, tal como
START
TRANSACTION, COMMIT, o ROLLBACK.



Vamos a definir un trigger que copie en una tabla de auditoria que copie en esa tabla el cdigo
de los nuevos clientes insertados.




DELIMITER //

CREATE TABLE auditoria (codCli INT(11));
CREATE TRIGGER auditoriaClientes AFTER INSERT ON customers FOR EACH ROW


BEGIN
INSERT INTO auditoriaClientes set cliente row.customerNumber;
END//

DELIMITER ;



Una transaccin es una unidad de procesamiento que debe ejecutarse en su totalidad o
anularse ntegramente. De manera que deben ejecutarse ntegramente. Si falla en algn
momento de su ejecucin hay que deshacer todo el proceso hasta antes de su inicio.

Disear un trigger de tal forma que no se permita la modificacin del lmite de crdito
de un cliente a un valor superior a 250.000. Si se intenta modificar se pondr el valor
mximo permitido 250.000

Das könnte Ihnen auch gefallen