14
13 © MARZO 2015 EUGENIA BAHIT – CREATIVE COMMONS ATRIBUCIÓN COMPARTIRIGUAL SILUETA DE MUJER CREADA POR LEONARDO B. CUNHA Pocket Edition 2015 STORED PROCEDURES

13 Pocket Edition 2015 - index-of.co.ukindex-of.co.uk/Magazines/TheOriginalHackerNro13.pdf© 2015 Eugenia Bahit, The Original Hacker Pocket Edition Nro. 13 – Creative Commons Atribución

  • Upload
    others

  • View
    7

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 13 Pocket Edition 2015 - index-of.co.ukindex-of.co.uk/Magazines/TheOriginalHackerNro13.pdf© 2015 Eugenia Bahit, The Original Hacker Pocket Edition Nro. 13 – Creative Commons Atribución

13

© MARZO 2015 EUGENIA BAHIT – CREATIVE COMMONS ATRIBUCIÓN COMPARTIRIGUALSILUETA DE MUJER CREADA POR LEONARDO B. CUNHA

Pocket Edition 2015

STORED PROCEDURES

Page 2: 13 Pocket Edition 2015 - index-of.co.ukindex-of.co.uk/Magazines/TheOriginalHackerNro13.pdf© 2015 Eugenia Bahit, The Original Hacker Pocket Edition Nro. 13 – Creative Commons Atribución

© 2015 Eugenia Bahit, The Original Hacker Pocket Edition Nro. 13 – Creative Commons Atribución CompartirIgual2

PROBLEMA

En el desarrollo iterativo e incremental, la base de datos suele modificarse en cada sprint y esto conlleva errores de implementación, sobre todo, en el propio proceso de desarrollo

Mantenimiento de la base de datos del sistema

Para los desarrolladores, no basta con un simple pull.

Page 3: 13 Pocket Edition 2015 - index-of.co.ukindex-of.co.uk/Magazines/TheOriginalHackerNro13.pdf© 2015 Eugenia Bahit, The Original Hacker Pocket Edition Nro. 13 – Creative Commons Atribución

© 2015 Eugenia Bahit, The Original Hacker Pocket Edition Nro. 13 – Creative Commons Atribución CompartirIgual3

SOLUCIÓNMANTENIMIENTO DE LA BASE DE DATOS DEL SISTEMA

Los cambios en la base de datos siempre deben 

verse reflejados en un único archivo SQL

Base deDatos

SQL Tabla

Agrega

Elimina

Modifica

datos

Page 4: 13 Pocket Edition 2015 - index-of.co.ukindex-of.co.uk/Magazines/TheOriginalHackerNro13.pdf© 2015 Eugenia Bahit, The Original Hacker Pocket Edition Nro. 13 – Creative Commons Atribución

© 2015 Eugenia Bahit, The Original Hacker Pocket Edition Nro. 13 – Creative Commons Atribución CompartirIgual4

HOW TOMANTENIMIENTO DE LA BASE DE DATOS DEL SISTEMA

El script SQL debe correrse siempre luego de cada pull

mysql -u root -p DATABASENAME < path/to/myapp/myapp.sql

Tener en cuenta que cualquier error arrojado por MySQL tras la ejecución del script, implicará que no todas las sentencias se habrán ejecutado

Page 5: 13 Pocket Edition 2015 - index-of.co.ukindex-of.co.uk/Magazines/TheOriginalHackerNro13.pdf© 2015 Eugenia Bahit, The Original Hacker Pocket Edition Nro. 13 – Creative Commons Atribución

© 2015 Eugenia Bahit, The Original Hacker Pocket Edition Nro. 13 – Creative Commons Atribución CompartirIgual5

HOW TOMANTENIMIENTO DE LA BASE DE DATOS DEL SISTEMA

Utilizar las cláusulas IF NOT EXISTS e IF EXISTS para crear y eliminar tablas respectivamente

CREATE TABLE IF NOT EXISTS table_name (…

)

Nunca hacer un DROP TABLE “preventivo” antes de crear la tabla. Si se modificará, utilizar ALTER TABLE (se explica más adelante)

DROP TABLE IF EXISTS table_name (…

)

Page 6: 13 Pocket Edition 2015 - index-of.co.ukindex-of.co.uk/Magazines/TheOriginalHackerNro13.pdf© 2015 Eugenia Bahit, The Original Hacker Pocket Edition Nro. 13 – Creative Commons Atribución

© 2015 Eugenia Bahit, The Original Hacker Pocket Edition Nro. 13 – Creative Commons Atribución CompartirIgual6

HOW TOMANTENIMIENTO DE LA BASE DE DATOS DEL SISTEMA

Utilizar la cláusula ALTER TABLE dentro de un procedimiento almacenado (stored procedure) para evitar fallosDELIMITER //

DROP PROCEDURE IF EXISTS nombre_procedimiento //CREATE PROCEDURE nombre_procedimiento() BEGIN CONDICION

THENALTER TABLE...;

END IF; END //

DELIMITER ;

CALL nombre_procedimiento();

Page 7: 13 Pocket Edition 2015 - index-of.co.ukindex-of.co.uk/Magazines/TheOriginalHackerNro13.pdf© 2015 Eugenia Bahit, The Original Hacker Pocket Edition Nro. 13 – Creative Commons Atribución

© 2015 Eugenia Bahit, The Original Hacker Pocket Edition Nro. 13 – Creative Commons Atribución CompartirIgual7

HOW TOMANTENIMIENTO DE LA BASE DE DATOS DEL SISTEMA

Utilizar IF NOT EXISTS como condición del stored procedure para agregar camposDELIMITER //

DROP PROCEDURE IF EXISTS agregar_columna //CREATE PROCEDURE agregar_columna() BEGIN IF NOT EXISTS ( SELECT NULL FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'tabla' AND table_schema = DATABASE() AND column_name = 'columna_nueva' ) THEN ALTER TABLE tabla ADD COLUMN columna_nueva INT(3); END IF; END //

DELIMITER ;

CALL agregar_columna();

Page 8: 13 Pocket Edition 2015 - index-of.co.ukindex-of.co.uk/Magazines/TheOriginalHackerNro13.pdf© 2015 Eugenia Bahit, The Original Hacker Pocket Edition Nro. 13 – Creative Commons Atribución

© 2015 Eugenia Bahit, The Original Hacker Pocket Edition Nro. 13 – Creative Commons Atribución CompartirIgual8

HOW TOMANTENIMIENTO DE LA BASE DE DATOS DEL SISTEMA

Utilizar IF EXISTS como condición del stored procedure para eliminar campos y/o modificarlos

DELIMITER //

DROP PROCEDURE IF EXISTS eliminar_columna //CREATE PROCEDURE eliminar_columna() BEGIN IF EXISTS ( SELECT NULL FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'tabla' AND table_schema = DATABASE() AND column_name = 'columna' ) THEN ALTER TABLE tabla DROP COLUMN columna; END IF; END //

DELIMITER ;

CALL eliminar_columna();

Page 9: 13 Pocket Edition 2015 - index-of.co.ukindex-of.co.uk/Magazines/TheOriginalHackerNro13.pdf© 2015 Eugenia Bahit, The Original Hacker Pocket Edition Nro. 13 – Creative Commons Atribución

© 2015 Eugenia Bahit, The Original Hacker Pocket Edition Nro. 13 – Creative Commons Atribución CompartirIgual9

HOW TOMANTENIMIENTO DE LA BASE DE DATOS DEL SISTEMA

Error «Thread stack overrun» al ejecutar un procedimiento almacenado

; thread_stack = 128K

Localizar el archivo de configuración de MySQL (generalmente llamado my.cnf) y comentar la variable thread_stack colocando un punto y coma delante:

/etc/mysql/my.cnf

En Debian GNU/Linux y distribuciones derivadas (como Ubuntu), este archivo podrá encontrarse en:

Reiniciar MySQL antes de volver a intentarlo:

Service mysql restart

SOLUCIÓN

Page 10: 13 Pocket Edition 2015 - index-of.co.ukindex-of.co.uk/Magazines/TheOriginalHackerNro13.pdf© 2015 Eugenia Bahit, The Original Hacker Pocket Edition Nro. 13 – Creative Commons Atribución

© 2015 Eugenia Bahit, The Original Hacker Pocket Edition Nro. 13 – Creative Commons Atribución CompartirIgual10

HOW TOMANTENIMIENTO DE LA BASE DE DATOS DEL SISTEMA

Utilizar la cláusula IGNORE en todo INSERT que se haga por defecto

INSERT IGNORE INTO tabla(campo_id_pk, campo2, campo3)

VALUES(1, 'dato 2.1', 'dato 3.1'),(2, 'dato 2.2', 'dato 3.2'),(3, 'dato 2.3', 'dato 3.3')

;

Procurar colocar todos los “INSERT” al final del script o en su defecto, en un archivo fixture.sql

Utilizar IGNORE y agregar las ID (claves primarias) evitará registros duplicados y dependencias insatisfechas

Page 11: 13 Pocket Edition 2015 - index-of.co.ukindex-of.co.uk/Magazines/TheOriginalHackerNro13.pdf© 2015 Eugenia Bahit, The Original Hacker Pocket Edition Nro. 13 – Creative Commons Atribución

© 2015 Eugenia Bahit, The Original Hacker Pocket Edition Nro. 13 – Creative Commons Atribución CompartirIgual11

HOW TOMANTENIMIENTO DE LA BASE DE DATOS DEL SISTEMA

Sobre la inserción de datos: archivos SQL de destino

Datos de inicialización requeridos por la app (ejemplo: tablas codificadoras de países, etc.)

Datos de prueba (ejemplo: usuarios para probar la aplicación)

Datos antiguos (ejemplo: backups)

fixture.sql

mock.sql

dump.sql

Page 12: 13 Pocket Edition 2015 - index-of.co.ukindex-of.co.uk/Magazines/TheOriginalHackerNro13.pdf© 2015 Eugenia Bahit, The Original Hacker Pocket Edition Nro. 13 – Creative Commons Atribución

© 2015 Eugenia Bahit, The Original Hacker Pocket Edition Nro. 13 – Creative Commons Atribución CompartirIgual12

SABER MÁS

¿Te gustaría aprender más sobre buenas prácticas de programación y bases de

datos?

MANTENIMIENTO DE LA BASE DE DATOS DEL SISTEMA

Documentación oficial de MySQL:http://dev.mysql.com/doc/

Mis papers en PDF sobre MySQL:http://library.originalhacker.org/search/mysql

Ayuda y soporte gratuito:http://forums.mysql.com http://stackoverflow.org

Curso profesional de Ingeniería de Software (a distancia):http://cursos.eugeniabahit.com/curso-3

Page 13: 13 Pocket Edition 2015 - index-of.co.ukindex-of.co.uk/Magazines/TheOriginalHackerNro13.pdf© 2015 Eugenia Bahit, The Original Hacker Pocket Edition Nro. 13 – Creative Commons Atribución

WEB PERSONAL:www.eugeniabahit.com

TWITTER:@eugeniabahit

REPOSITORIOS:http://repo.eugeniabahit.com

© 2015 Eugenia Bahit, The Original Hacker Pocket Edition Nro. 13 – Creative Commons Atribución CompartirIgual13

Eugenia BahitGLAMP Hacker & programadora eXtrema

Especializada en seguridad informática y desarrollo de Software mediante Ingeniería Inversa de código en Python y PHP.

Miembro de Free Software Foundation presidida por Richard Stallman (creador del proyecto GNU y el Software Libre) y The Linux Foundation presidida por Linus Torvalds (creador del kernel Linux).

Creadora de los proyectos Europio Engine, Jack The Stripper, python-printr y Enhancement CLI for PHP.

Fundadora de las revistas The Original Hacker y Hackers & Developers Magazine.

Dedicada actualmente a la docencia e investigación y a la Formación Profesional de Hackers y Programadores

SOBRE LA AUTORA

Page 14: 13 Pocket Edition 2015 - index-of.co.ukindex-of.co.uk/Magazines/TheOriginalHackerNro13.pdf© 2015 Eugenia Bahit, The Original Hacker Pocket Edition Nro. 13 – Creative Commons Atribución

© 2015 Eugenia Bahit, The Original Hacker Pocket Edition Nro. 13 – Creative Commons Atribución CompartirIgual14

Eres libre de:

Compartircopiar y distribuir este documento por cualquier medio y formato

Modificarcrear documentos derivados y distribuirlos

Pero:

Hazlo con respeto hacia al autorManteniendo la leyenda de copyright que ves al pie de cada página(cuando hagas cambios, indica que eres el responsable de esos cambios)

No quites la libertad a otrosCuando distribuyas este documento y/o tus modificaciones, deberásmantener la licencia original

LICENCIALicencia LibreCreative Commons Atribución CompartirIgual