1. Funciones SGBD Consulta y actualización de datos · 3. Permisos MYSQL ... todos los campos...
Transcript of 1. Funciones SGBD Consulta y actualización de datos · 3. Permisos MYSQL ... todos los campos...
1. Funciones SGBD
Las funciones provistas por un SGBD pueden agruparse en tres clases:
Consulta y actualización de datos
Mantenimiento de esquemas
Manejo de transacciones
Consulta y Actualización
Ésta es la clase más básica de funciones y la única que es visible "desde afuera".
Consiste en un conjunto de herramientas que permite a los distintos tipos de
usuarios del SGBD extraer, manipular y modifica la información almacenada en la
base de datos.
Mantenimiento de esquemas
El esquema de la base de datos es la descripción de la estructura de la
información almacenada en ella. Por ejemplo, para un sistema basado en tablas, el
esquema puede consistir en una lista de tablas en uso, los campos que contienen, el
tipo de datos de cada campo, descripciones en lenguaje natural del propósito de
cada tabla y cada campo, y restricciones sobre los valores admisibles en cada
campo.
Manejo de Transacciones
Una de las áreas principales de aplicación de los sgbd's es lo que se llama
procesamiento de transacciones. Una transacción es un programa de aplicación,
generalmente de duración breve, que accede y actualiza una parte también
generalmente pequeña de la base de datos. Típicos ejemplos son un depósito o
extracción de una cuenta bancaria, o una reservación en un vuelo, o una verificación
de una tarjeta de crédito.
2. Logs
Archivo de registro Tipo de información registrado en el archivo
El registro de error Registra problemas encontrados iniciando, ejecutando, o
parando mysqld.
El registro de consultas Registra las conexiones de clientes establecidas, y las
sentencias ejecutadas.
El registro de actualizaciones The update log Registra las sentencias que
cambian datos. Este registro está ya en desuso.
El registro binario Registra todas las sentencias que cambian datos. También
utilizado para replicación.
El registro de lentitud Registra todas las sentencias que tardarón más de
long_query_time segundos en ejecutarse, o no utilizaron índices.
3. Permisos MYSQL
Privilegios para los usuarios SELECT- Selecciona los registros de la tabla/s
INSERT- Insertar registro en la tabla/s
UPDATE- Actualizar datos ya existentes en la tabla/s
ALTER- Modificar la estructura de la tabla/s
CREATE- Crear nuevas tablas, bases datos.
DROP- Eliminar tablas o BD
Privilegios los de administradores. FILE- Permite al admin leer y gravar achivos en el server mySQL
PROCESS- Permite al administrador controlar los procesos.
RELOAD- Permite al administrador reformar los acesos,privilegios...
SHUTDOWN- Permite al admin apagar el servidor
Privilegios especiales que són: ALL- Todos los privilegios comentadas anteriormente
USAGE- Permite el acceso.
4. Un diccionario de datos de Mysql es una base de datos donde se almacenan
todos los campos relacionados con una tabla, además de los usuarios a los
que se vinculan. Contienen todas las tablas, estructuras y datos que tenemos
en una tabla.
5. Arquitectura SGBD
La arquitectura de tres capas
El objetivo de la arquitectura de tres esquemas consiste en formar una separación
entre las aplicaciones del usuario y la base de datos física. En esta arquitectura,
los esquemas se pueden definir en los tres niveles siguientes:
El nivel interno tiene un esquema interno, que describe la estructura física de
almacenamiento de la base de datos. El esquema interno emplea un modelo físico de
los datos y describe todos los detalles para su almacenamiento, así como los
caminos de acceso para la base de datos
El nivel conceptual tiene un esquema conceptual, que describe la estructura de
toda la base de datos para una comunidad de usuarios. El esquema conceptual
oculta los detalles de las estructuras físicas de almacenamiento y se concentra en
describir entidades, tipos de datos, vínculos, operaciones de los usuarios y
restricciones. En este nivel podemos usar un modelo de datos de alto nivel o uno de
implementación
El nivel externo o de vistas incluye varios esquemas externos o vistas de usurio.
Cada esquema externo describe la parte de la base de datos que interesa a un
grupo de usuarios determinado, y oculta a ese grupo el resto de la base de datos.
En este nivel podemos usar un modelo de datos de alto nivel o uno de
implementación
1 – crea un usuario llamado contable con clave inves que puede insertar, borrar y
actualizar registros en las tablas apuntes y cuentas en la base de datos
contabilidad se conectan desde el equipo 192.168.100.151.
GRANT PRIVILEGIOS ON BASE DATOS.TABLAS TO “usuario”@”lugar”
INDENTIFIED BY “contraseña” WITH GRANT OPTIONS;
FLUSH PRIVILEGES;
GRANT insert, delete, update ON contabilidad.apuntes TO
“contable”@”192.168.100.151” INDENTIFIED BY “inves” WITH GRANT
OPTIONS;
FLUSH PRIVILEGES;
GRANT insert, delete, update ON contabilidad.cuentas TO
“contable”@”192.168.100.151” INDENTIFIED BY “inves” WITH GRANT
OPTIONS;
FLUSH PRIVILEGES;
GRANT INSERT, DELETE, UPDATE ON CONTABILIDAD.CUENTAS TO
“CONTABLE”@”%” INDENTIFIED BY “INVES” WITH GRANT OPTIONS; --------
--------------> EL % ES PARA QUE PUEDAN CONECTARSE TODOS LOS
EQUIPOS, EJEMPLO EJERCICIO 2.
FLUSH PRIVILEGES;
CREAR USUARIO SIN PRIVILEGIOS CREATE USER “USUARIO”@”LUGAR”
INDENFIED BY “CONTRASEÑA” WITH GRANT OPTIONS;
ELIMINAR USUARIOS DROP USER NOMBREUSUARIO;
QUITAR PERMISOS REVOKE PRIVILEGIOS ON BASE DATOS.TABLAS
FROM “USUARIO”@”LUGAR”
FLUSH PRIVILEGES;
MODIFICA CONTRASEÑA SET PASSWORD FOR “USUARIO”@”LUGAR” =
MD5 O PASSWORD (“INVES”);
1.
mysql -u root -pinves -e "show variables;">todas_las_variables.txt
mysql -u root -pinves -e "show variables like
'%InnoDB%';">todas_las_variables_innodb.txt
2. kill
mysql> show processlist;
+----+------+-----------+------+---------+------+-------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+-----------+------+---------+------+-------+------------------+
| 68 | root | localhost | NULL | Query | 0 | NULL | show processlist |
| 71 | root | localhost | NULL | Sleep | 7 | | NULL |
+----+------+-----------+------+---------+------+-------+------------------+
2 rows in set (0.00 sec)
mysql> kill 71;
Query OK, 0 rows affected (0.00 sec)
mysql> show processlist;
+----+------+-----------+------+---------+------+-------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+-----------+------+---------+------+-------+------------------+
| 68 | root | localhost | NULL | Query | 0 | NULL | show processlist |
+----+------+-----------+------+---------+------+-------+------------------+
1 row in set (0.00 sec)
3.
4.
poniendo set no se puede.
cambiando del fichero de configuracion /etc/mysql/my.cnf
/mysql.ini ????
Arrancando el servidor manualmente con opciones varias
5.
tiempo en segundos desde que se inicio el servidor.
show status like "uptime";
no se puede
SELECT * FROM information_schema.`GLOBAL_STATUS` where
variable_name="uptime";
+---------------+----------------+
| VARIABLE_NAME | VARIABLE_VALUE |
+---------------+----------------+
| UPTIME | 2561 |
+---------------+----------------+
1 row in set (0.00 sec)
update information_schema.`GLOBAL_STATUS` set variable_value=25 where
variable_name="uptime";
ERROR 1044 (42000): Access denied for user 'root'@'localhost' to database
'information_schema'
3.2
1.
create user admin@localhost;
set password for admin@localhost=password("admin");
grant all privileges on *.* to admin@localhost;
2.
opcion 1
revoke super, grant on *.* from admin@localhost;
opcion 2
update mysql.user set Super_priv="N" where user=admin and host=localhost;
update mysql.user set Grant_priv="N" where user=admin and host=localhost;
flush privileges;
opcion 3:
update mysql.user set Super_priv="N", Grant_priv="N" where user=admin and
host=localhost;
flush privileges;
opcion 4:
mysqladmin, modificar las columnas y luego flush
3.
grant all privileges on ebanca.* to admin_ebanca@"www.guara.com";
no dar privilegios:
grant usage on ebanca.* to admin_ebanca@"www.guara.com";
4. no encripta la contraseña, p.e. "inves". y cuando la escribamos en el cliente, no se
podra acceder porque el programa p.e. mysql si la encripta
("*CDAD9978C4EB14E930F814E485EC9EC72F73185A") y no coincide.
5.
los administrativos: grant, shutdown, super, alter, drop
6. son diferentes funciones para encriptar información
select password("palabra");
+-------------------------------------------+
| password("palabra") |
+-------------------------------------------+
| *630DB5E966E9CC85063B48608823CE32EC255BE2 |
+-------------------------------------------+
1 row in set (0.00 sec)
select md5("palabra");
+----------------------------------+
| md5("palabra") |
+----------------------------------+
| d585c75f67ab4327ae31b88879f6e7c6 |
+----------------------------------+
1 row in set (0.00 sec)
grant all privileges on limpioj3.* to joomla@localhost identified by "inves";
grant all privileges on foro.* to uforo@localhost identified by "inves";
insert into mysql.user (Host, User, Password) values ("localhost", "miguel", "inves");
UPDATE `mysql`.`user` SET `Password` = PASSWORD( 'inves' ) WHERE
`user`.`Host` = 'localhost' AND `user`.`User` = 'miguel';
grant all privileges on *.* to antonio@localhost identified by "inves";
grant all privileges on *.* to antonio@localhost identified by "inves" with grant
option;
grant select, insert on *.* to lolo@localhost identified by "inves" with grant option;
INSERT INTO mysql.user VALUES( 'localhost' ,'antonio' , PASSWORD('sierra'),
'y' , 'y' , 'y' , 'y' ,'Y', "y" ,'Y', "y", "y" , 'Y', "y", "y" , 'Y' , 'Y' ) ;
INSERT INTO mysql.user (Host, User, Password,
Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv) VALUES
('localhost', 'pedro', PASSWORD ("sierra"),"Y","Y","Y","Y","Y","Y");
REVOKE ALL PRIVILEGES ON notas . * FROM amin_mblog@localhost
REVOKE insert ON *.* FROM pedro1@localhost;
REVOKE insert ON ebanca.* FROM angel@"%";
GRANT ALL ON *.* TO angel@'localhost' WITH MAX_QUERIES_PER_HOUR 1
MAX_UPDATES_PER_HOUR 1
MAX_CONNECTIONS_PER_HOUR 1
MAX_USER_CONNECTIONS 1;
grant usage on *.* to pedro@localhost identified by "inves";
DELIMITER //
drop procedure proc5//
CREATE PROCEDURE proc5 ()
BEGIN
DECLARE x1 CHAR(5) DEFAUlT 'fuera';
DECLARE x1 CHAR(5) DEFAUlT 'fuera';
DECLARE x2 CHAR(5) DEFAUlT 'dos';
SELECT x1 "primero";
BEGIN
DECLARE x1 CHAR(5) DEFAULT 'dentro';
SELECT x1 "dentro del 2do begin";
SELECT x2 "dentro del 2do begin";
ENd;
SELECT x1 "final fuera";
END; //
delimiter //
drop procedure proc8//
CREATE PRoCEDURE proc8(IN p INT)
BEGIN
CASE p
WHEN 0 THEN select "cero";
WHEN 1 THEN select "uno";
WHEN 2 THEN select "dos";
WHEN 3 THEN select "tres";
WHEN 4 THEN select "cuatro";
WHEN 5 THEN select "cinco";
ELSE select "no se no se";
END CASE;
END;//
-----
delimiter //
drop procedure proc9//
CREATE PRoCEDURE proc9(IN p INT)
BEGIN
IF p= 0 THEN select "cero";
ELSEIF p= 1 THEN select "uno";
ELSEIF p= 2 THEN select "dos";
ELSEIF p= 3 THEN select "tres";
ELSEIF p= 4 THEN select "cuatro";
ELSEIF p= 5 THEN select "cinco";
ELSE select "no se no se";
END IF;
END;//
DELIMITER //
drop function divisible//
CREATE FUNCTION divisible (num1 INT, num2 INT)
RETURNS int deterministic
BEGIN
DECLARE divisible int default 1;
if num2 <>0 then
if MOD(num1,num2) then SET divisible = 0;
END IF;
else
set divisible=-1;
end if;
RETURN(divisible);
END;//
----------------------------------------------------------
EJERCICIO~~2
DELIMITER //
DROP PROCEDURE IF EXISTS SEMANA //
CREATE PROCEDURE SEMANA (IN DIA INT)
BEGIN
CASE DIA
WHEN 1 THEN SELECT "DOMINGO";
WHEN 2 THEN SELECT "LUNES";
WHEN 3 THEN SELECT "MARTES";
WHEN 4 THEN SELECT "MIERCOLES";
WHEN 5 THEN SELECT "JUEVES";
WHEN 6 THEN SELECT "VIERNES";
WHEN 7 THEN SELECT "SABADO";
ELSE SELECT "NUMERO NO VALIDO";
END CASE;
END;
//
DELIMITER //
CREATE FUNCTION dias (dia INT)
RETURNS VARCHAR(100) deterministic
BEGIN
DECLARE nombredia VARCHAR(100);
IF dia IS NOT NULL AND ( dia < 8 OR dia >= 0) THEN
CASE dia
WHEN 0 THEN
SET nombredia = 'Domingo';
WHEN 1 THEN
SET nombredia = 'Lunes';
WHEN 2 THEN
SET nombredia = 'Martes';
WHEN 3 THEN
SET nombredia = 'Miercoles';
WHEN 4 THEN
SET nombredia = 'Jueves';
WHEN 5 THEN
SET nombredia = 'Viernes';
WHEN 6 THEN
SET nombredia = 'Sabado';
ELSE
SET nombredia = 'nope';
END CASE;
ELSE
SET nombredia = 'nope';
END IF;
RETURN(nombredia);
END;//
CREATE FUNCTION divisible (num1 INTEGER, num2 INTEGER)
RETURNS VARCHAR(50);
BEGIN
DECLARE divisible VARCHAR(100);
IF num1 > 0 AND num2 > 0 THEN
IF MOD(num1,num2) = 0 THEN
SET divisible = 1;
ELSE
SET divisible = 0;
END IF;
ELSE
SET divisible = 'nei'
END IF;
RETURN(divisible);
END;//
---------------------Sobre la base de datos liga crea una función que devuelva 1 si
ganó el visitante y O en caso contrario. El parámetro de entrada es el resultado
con el formato 'xxx-xxx'.-------------------------
drop function liga.ganavisitante//
delimiter //
create function liga.ganavisitante(a varchar(7)) returns int deterministic
begin
declare ganador int;
declare valor1 int;
declare valor2 int;
set valor1=substring_index(a,"-",1);
set valor2=substring_index(a,"-",-1);
if valor1 >= valor2 then set ganador=0;
else set ganador=1;
end if;
return ganador;
end;//
select liga.ganavisitante("25-3")//
--------------------
create procedure palindromo(in palabra varchar(50))
begin
declare palsino varchar(20);
if palabra = reverse(palabra) then set palsino= "si es palindroma";
else set palsino= "no es palindroma";
end if;
select palsino;
end;//
---- hacerlo con frases.
---------------------------
1. Sobre la base de pruebas test crea un procedimiento para mostrar el año
actual.
-------------------------------------
CREATE PROCEDURE test.fecha()
select YEAR(now());
call fecha();
-----------------
Crea y muestra una variable de usuario con SET. ¿Debe ser de sesión o puede
ser global?
delimiter //
-------------
set @variable=1;
select @variable//
-----------
3. Usa un procedimiento que sume uno a la variable anterior cada vez que se
ejecute. En este caso la variable es de entrada salida ya que necesitamos su valor
para Incrementarlo y además necesitamos usarlo después de la función para
comprobarlo.
delimiter //
create procedure test.aumentar(inout a int)
begin
set a=a+1;
end;//
call aumentar(@variable)//
SELECT @a//
-------Crea un procedimiento que muestre las tres primeras letras de una cadena
pasada como parámetro en
mayúsculas
delimiter //
create procedure cortando(in cadena char(20) )
begin
set cadena=substr(cadena, 1,3);
set cadena=upper(cadena);
select cadena;
end;//
create procedure test.tres(in a char(20), out b char(20))
begin
set b=CONCAT(UPPER(LEFT(a,3)),SUBSTR(a,4));
end;//
call tres("estruendo",@mayus)//
select @mayus//
-------Crea un procedimiento que muestre dos cadenas pasadas como parámetros
concatenadas y en mayúscula.
delimiter //
create procedure test.concatenar(in a char(20), in b char(20),out c char(20))
begin
set c=CONCAT(UPPER (a), UPPER(b));
end;//
call concatenar("hola"," chato",@frase)//
select @frase//
-------Crea una función que devuelva el valor de la hipotenusa de un triángulo a
partir de los valores de sus lados.
drop function hipo//
delimiter //
create function hipo(a int,b int) Returns int
Begin
declare raiz int;
declare potencia int;
set potencia=power(a,2)+power(b,2);
set raiz=sqrt(potencia);
return raiz;
end;//
select hipo(2,2)//
--------------------
DELIMITER //
CREATE FUNCTION totalpuntos (resultado char(7))
RETURNS INT
BEGIN
DECLARE a INT;
DECLARE b INT;
DECLARE total INT;
SET a=SUBSTR(resultado,1,3);
SET b=SUBSTR(resultado,5,7);
SET total=a+b;
RETURN total;
END; //
DELIMITERÂ ;
SELECT totalpuntos('050-025');
SET @p1='050-025';
SELECT totalpuntos(@p1);
CREATE PROCEDURE test.hola_mundo() SELECT ' hola mundo ';
call hola_mundo();
------------------------------
delimiter //
CREATE PROCEDURE test.hola_mundo3()
begin
SELECT ' hola mundo ';
SELECT ' adios mundo ';
end//
delimiter ;
call hola_mundo();
DELIMITER SS
DROP PROCEDURE If EXISTS hola mundo$$
CREATE PROCEDURE test . hola_mundo()
BEGIN
SELECT ' hola mundo ';
END$S
CREATE PROCEDURE version() SELECT version();
DELIMITER //
CREATE PROCEDURE fecha()
LANGUAGE SQL
NOT DETERMINISTIC
COMMENT 'A Procedure '
SELECT CURRENT_DATE ,
//
-------------------------------
DELIMITER //
CREATE FUNCTION suma(a int, b int) RETURNS int deterministic
BEGIN
RETURN(a+b);
END; //
select suma(2,2)//
----
DELIMITER //
CREATE FUNCTION suma2(a int, b int) RETURNS int deterministic
BEGIN
select (a*b) "Producto";
RETURN(a+b);
END; //
No se puede:
ERROR 1415 (0A000): Not allowed to return a result set from a function
---- lo mismo con procedimiento
DELIMITER //
CREATE procedure suma(in a int, in b int, out c int )
BEGIN
set c=(a+b);
END; //
DELIMITER ;
call suma(2,2, @a);
select @a;
-----------------
---- lo mismo con procedimiento de otra manera
DELIMITER //
drop procedure suma2//
CREATE procedure suma2(in a int, in b int)
BEGIN
select (a+b) "La suma es";
END; //
call suma2(2,2)//
-------------------------------
DELIMITER //
CREATE FUNCTION resultado(nota int) RETURNS VARCHAR(20) deterministic
BEGIN
IF nota>=5 THEN return "aprobado";
END IF;
END; //
select resultado (5)//
ejemplo:
mysql> select resultado (5)//
+---------------+
| resultado (5) |
+---------------+
| aprobado |
+---------------+
1 row in set (0.00 sec)
mysql> select resultado (4)//
ERROR 1321 (2F005): FUNCTION resultado ended without RETURN
----
DROP FUNCTION resultado//
CREATE FUNCTION resultado(nota int) RETURNS VARCHAR(20) deterministic
BEGIN
IF nota>=5 THEN return "aprobado";
ELSE return "SUSPENSO";
END IF;
END; //
progr estructurada solo un return:
ejemplo:
mysql> select resultado (5)//
+---------------+
| resultado (5) |
+---------------+
| aprobado |
+---------------+
1 row in set (0.00 sec)
mysql> select resultado (4)//
+---------------+
| resultado (4) |
+---------------+
| SUSPENSO |
+---------------+
1 row in set (0.00 sec)
mysql>
progr estructurada solo un return:
DROP FUNCTION resultado//
CREATE FUNCTION resultado(nota int) RETURNS VARCHAR(20) deterministic
BEGIN
IF nota>=5 THEN return "aprobado";
ELSE return "SUSPENSO";
END IF;
END; //
-----
---------------****************
--------------------------------------------
DELIMITER //
CREATE FUNCTION estado(in_estado CHAR(1))
RETURNS VARCHAR(20)
BEGIN
DECLARE estado VARCHAR(20) ;
IF in_estado - ' P' THEN
SE! estado- ' cadu:=ado ' i
ELSEIF in estado - ' O' THEN
SET estado- ' activo ';
ELSEIF in_status - ' N' THEN
SET estado - ' nuev~ ';
END IF;
RETURN(estado) :
END; //
DROP FUNCTION resultado//
CREATE FUNCTION resultado(nota int) RETURNS VARCHAR(20) deterministic
BEGIN
IF nota>=5 THEN return "aprobado";
ELSE return "SUSPENSO";
END IF;
END; //
-----
progr estructurada solo un return:
delimiter //
DROP FUNCTION resultado//
CREATE FUNCTION resultado(nota int) RETURNS VARCHAR(20) deterministic
BEGIN
declare estado varchar (20);
IF nota>=5 THEN set estado="aprobado";
ELSE set estado="SUSPENSO";
END IF;
return estado;
END; //
----
delimiter //
DROP FUNCTION resultado//
CREATE FUNCTION resultado(nota int) RETURNS VARCHAR(20) deterministic
BEGIN
declare estado varchar (20);
IF nota>5 THEN set estado="aprobado";
ELSE if nota=5 then set estado="justito";
else set estado="SUSPENSO";
END IF;
END IF;
return estado;
END; //
----
delimiter //
DROP FUNCTION resultado//
CREATE FUNCTION resultado(nota int) RETURNS VARCHAR(20) deterministic
BEGIN
declare estado varchar (20);
IF nota>5 THEN set estado="aprobado";
ELSEif nota=5 then set estado="justito";
else set estado="SUSPENSO";
END IF;
return estado;
END; //
----
delimiter //
DROP FUNCTION resultado//
CREATE FUNCTION resultado(nota int) RETURNS VARCHAR(20) deterministic
BEGIN
declare estado varchar (20);
IF nota>5 THEN begin
set estado="aprobado";
if nota=10 then set estado="Jose Cristian";
end if;
end;
ELSEif nota=5 then set estado="justito";
else set estado="SUSPENSO";
END IF;
return estado;
END; //
----
delimiter //
DROP FUNCTION resultado//
CREATE FUNCTION resultado(nota int) RETURNS VARCHAR(20) deterministic
BEGIN
declare estado varchar (20);
IF nota>5 THEN begin
set estado="aprobado";
if nota=10 then set estado=concat(estado, ", Jose Cristian");
end if;
end;
ELSEif nota=5 then set estado="justito";
else set estado="SUSPENSO";
END IF;
return estado;
END; //
---------------****************
--------------------------------------------
-----
DELIMITER //
DROP function esimpar//
CREATE FUNCTION esimpar(numero int)
RETURNS int deterministic
BEGIN
DECLARE impar INT default 0;
IF MOD(numero,2) THEN SET impar=TRUE;
END IF ;
RETURN (impar);
END ; //
------
DELIMITER //
DROP PROCEDURE IF EXISTS muestra_estado//
CREATE PROCEDURE muestra_estado(in numero int)
BEGIN
IF (esimpar(numero)) THEN
SELECT CONCAT (numero," es impar") ;
ELSE
SELECT CONCAT(numero," es par") ;
END IF;
END; //
DELIMITER //
CREATE PROCEDURE proc20 ()
BEGIN
DECLARE i int DEFAULT 0;
REPEAT
SET i = i+1;
IF MOD(i,2)<>0 THEN select concat (i , " es impar " ) ;
END IF ;
UNTIL i >= 20 END REPEAT;
END ; //