Вы находитесь на странице: 1из 19

ADMINISTRACION DE BASE DE DATOS

L.I. NICOLAS CABRERA HIDALGO

INTRODUCCION

Con el crecimiento de Internet, y el desarrollo de sistemas de informacin bajo la arquitectura


Cliente/Servidor, los sistemas de cmputo, en general, estn expuestos a mltiples amenazas,
vulnerabilidades y ataques cada vez ms complejos. Por lo tanto, es importante que las
organizaciones implementen bitcoras (o archivos logs) para almacenar los sucesos que
ocurren en el sistema. La informacin contenida en una bitcora es muy importante y til
cuando ocurre un incidente de seguridad o cuando se realiza una auditora de sistemas.

PEDRO HERNANDEZ AGUIAR

ADMINISTRACION DE BASE DE DATOS

L.I. NICOLAS CABRERA HIDALGO

BITACORAS
Herramienta que permite registrar, analizar, detectar y notificar eventos que sucedan en
cualquier sistema de informacin utilizado en las organizaciones. La estructura ms ampliamente
usada para grabar las modificaciones de la base de datos.
Funciones
Permite guardar las transacciones realizadas sobre una base de datos en especfico, de tal
manera que estas transacciones puedan ser auditadas y analizadas posteriormente. Pueden
obtenerse datos especficos de la transaccin como son la Operacin que se realiz, el Usuario de
BD y Windows, Fecha, Maquina y Programa.
Como crear una bitacora en MySQL
Estando en el directorio correcto, antes de entrar a MySQL, ponemos la siguiente lnea de cdigo:
mysql -hlocalhost -uroot --tee=F:bitacora.txt

La estructura es ampliamente usada para grabar las modificaciones de la base de datos


es la Bitcora, herramienta que permite registrar, analizar detectar y notificar eventos que
suceden en cualquier sistemas de informacion utilizado en las organizaciones. La
estructura mas ampliamente usada para grabar las modificaciones de la BD.
Cuales son sus funciones
La importancia de las bitcoras es la de recuperar informacin ante incidentes de
seguridad, deteccin de comportamiento inusual, informacin para resolver problemas,
evidencia legal, es de gran ayuda en las tareas de cmputo forense.
Cada registro de la bitcora escribe una nica escritura de base de datos y tiene lo
siguiente :
Nombre de la transaccin : Nombre de la transaccin que realiz la operacin de
escritura.
Nombre del dato : El nombre nico del dato escrito.
Valor antiguo : El valor del dato antes de la escritura.
Valor nuevo : El valor que tendr el dato despus de la escritura.
Es fundamental que siempre se cree un registro en la bitcora cuando se realice una
escritura antes de que se modifique la base de datos.
Tambin tenemos la posibilidad de deshacer una modificacin que ya se ha escrito en la
base de datos, esto se realizar usando el campo del valor antiguo de los registros de la
bitcora.
Los registros de la bitcora deben residir en memoria estable como resultado el volumen
de datos en la bitcora puede ser exageradamente grande.

PEDRO HERNANDEZ AGUIAR

ADMINISTRACION DE BASE DE DATOS

L.I. NICOLAS CABRERA HIDALGO

Una bitcora puede registrar mucha informacin acerca de eventos relacionados con el
sistema que la genera los cuales pueden ser:

Fecha y hora.
Host origen.
Usuario.
Actividad realizada

Bitcora PostgreSQL
log_destination (cadena)
PostgreSQL soporta varios mtodos para los mensajes del servidor de registro, incluyendo stderr,
csvlog y syslog. En Windows, registro de eventos tambin es compatible. Establezca este parmetro
en una lista de destinos del registro que desee separadas por comas. El valor predeterminado es
iniciar sesin en stderr solamente. Este parmetro slo se puede configurar en el archivo
postgresql.conf o en la lnea de comandos del servidor.
Si csvlog est incluido en log_destination, las entradas de registro se emiten en "valores separados
por comas" (CSV), que es conveniente para los registros de carga en los programas. Consulte la
Seccin 18.7.4 para ms detalles. logging_collector debe estar activada para generar una salida de
registro en formato CSV.
logging_collector (boolean)
Este parmetro capta los mensajes de registro de civil y en formato CSV enviados a stderr y los
redirige a los archivos de registro. Este enfoque a menudo es ms til que la de acceder a syslog, ya
que algunos tipos de mensajes no aparezcan en la salida de syslog (un ejemplo comn es de
mensajes de error dinmico-enlazador). Este parmetro slo se puede configurar en el arranque del
servidor.
log_directory (cadena)
Cuando logging_collector est habilitado, este parmetro determina el directorio en el que se
crearn los archivos de registro. Se puede especificar como una ruta absoluta o relativa al directorio
de datos de clster. Este parmetro slo se puede configurar en el archivo postgresql.conf o en la
lnea de comandos del servidor.
log_filename (cadena)
Cuando logging_collector est habilitado, este parmetro define los nombres de archivo de los
archivos de registro creados. El valor se trata como un patrn strftime , por lo % se escapa se puede
utilizar para especificar nombres de archivo variables en el tiempo . (Tenga en cuenta que si hay
algn % se escapa de tiempo que dependen de zonas, el clculo se realiza en la zona especificada
por log_timezone . ) Tenga en cuenta que strftime del sistema no se utiliza directamente, por lo
especfico de la plataforma (no estndar) extensiones no funciona.
Si especifica un nombre de archivo sin escapes, usted debe hacer planes para utilizar una utilidad
de rotacin de registro para evitar el tiempo de llenar todo el disco. En versiones anteriores a la 8.4,

PEDRO HERNANDEZ AGUIAR

ADMINISTRACION DE BASE DE DATOS

L.I. NICOLAS CABRERA HIDALGO

si no hay escapes % estaban presentes , PostgreSQL agregara esta poca de la hora de creacin del
nuevo archivo de registro, pero esto ya no es el caso.
Si la salida de formato CSV est activado en log_destination , Csv se anexar al nombre del archivo
de registro de marca de tiempo para crear el nombre de archivo para la salida de formato CSV. (Si
log_filename termina en. Log, el sufijo se sustituye en su lugar. ) En el caso del ejemplo anterior, el
nombre del archivo CSV se server_log.1093827753.csv.
Este parmetro slo se puede configurar en el archivo postgresql.conf o en la lnea de comandos
del servidor.
log_rotation_age (entero)
Cuando logging_collector est habilitado, este parmetro determina el tiempo de vida mximo de
un archivo de registro individual. Una vez transcurridos estos minutos, se crear un nuevo archivo
de registro. Ajuste a cero para desactivar la creacin basada en el tiempo de los nuevos archivos de
registro. Este parmetro slo se puede configurar en el archivo postgresql.conf o en la lnea de
comandos del servidor.
log_rotation_size (entero)
Cuando logging_collector est habilitado, este parmetro determina el tamao mximo de un
archivo de registro individual. Despus de esto muchos kilobytes se han emitido a un archivo de
registro, se crear un nuevo archivo de registro. Ajuste a cero para deshabilitar el tamao basado
en la creacin de nuevos archivos de registro. Este parmetro slo se puede configurar en el archivo
postgresql.conf o en la lnea de comandos del servidor.
log_truncate_on_rotation (boolean )
Cuando logging_collector est habilitado, este parmetro har que PostgreSQL para truncar
(sobrescribir), en lugar de anexar a, cualquier archivo de registro existente con el mismo nombre.
Sin embargo, el truncamiento se producir slo cuando un nuevo archivo se abre debido a la
rotacin basada en el tiempo, no durante el inicio del servidor o de rotacin basada en el tamao.
Cuando est apagado, los archivos ya existentes se aadirn a en todos los casos. Por ejemplo , el
uso de esta opcin en combinacin con un log_filename como postgresql- % H.log se traducira en
la generacin de veinticuatro archivos de registro cada hora y despus cclicamente sobrescribirlos.
Este parmetro slo se puede configurar en el archivo postgresql.conf o en la lnea de comandos
del servidor.
log_min_messages (enum )
Controla qu niveles de mensajes se escriben en el registro del servidor. Los valores vlidos son
DEBUG5 , DEBUG4 , DEBUG3 , DEBUG2 , debug1 , INFO, AVISO , WARNING, ERROR LOG, FATAL , y el
pnico. Cada nivel incluye todos los niveles que le siguen. Cuanto ms tarde el nivel, menos
mensajes se envan al registro. El valor predeterminado es WARNING . Tenga en cuenta que LOG
tiene un rango diferente aqu que en client_min_messages . Los superusuarios pueden cambiar esta
configuracin.
log_min_error_statement (enum )

PEDRO HERNANDEZ AGUIAR

ADMINISTRACION DE BASE DE DATOS

L.I. NICOLAS CABRERA HIDALGO

Controla qu sentencias SQL que causan una condicin de error se registran en el registro del
servidor. La instruccin SQL actual est incluido en la entrada de registro para cualquier mensaje de
la gravedad especificado o superior. Los valores vlidos son DEBUG5, DEBUG4 , DEBUG3 , DEBUG2
, debug1 , INFO, AVISO , WARNING, ERROR LOG, FATAL , y el pnico. El valor predeterminado es
ERROR, lo que significa que las declaraciones que causan errores, mensajes , errores fatales , o
pnicos registro se registrarn. Para activar eficazmente fuera de registro de las declaraciones en su
defecto, establezca este parmetro en PANICO. Los superusuarios pueden cambiar esta
configuracin.
log_min_duration_statement (entero)
Hace que la duracin de cada declaracin completa que estar conectado si la sentencia se ejecut
por lo menos durante el nmero especificado de milisegundos. Al establecer esta a cero imprime
todas las duraciones de los estados. Menos-uno ( el predeterminado) desactiva duraciones
declaracin de registro. Por ejemplo, si lo establece en 250 ms luego todas las sentencias SQL que
se ejecutan 250ms o ms se registrarn. La activacin de este parmetro puede ser til en la
bsqueda de consultas no optimizadas en las aplicaciones. Los superusuarios pueden cambiar esta
configuracin.
Para los clientes que usan el protocolo prolongado consulta, duraciones del Parse , Bind, y ejecutar
los pasos se registran de forma independiente.

PARTICIONES en Mysql
Particionar tablas en MySQL nos permite rotar la informacin de nuestras tablas en diferentes
particiones, consiguiendo as realizar consultas ms rpidas y recuperar espacio en disco al borrar
los registros. El uso ms comn de particionado es segn fecha (date).
Para ver si nuestra base de datos soporta particionado simplemente ejecutamos:
SHOW VARIABLES LIKE '%partition%';

Crear particiones
1.- Creamos la tabla reports:
CREATE TABLE reports (
id int(10) NOT NULL AUTO_INCREMENT,
date datetime NOT NULL,
report TEXT,
PRIMARY KEY (id,date)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
Como se puede ver hemos aadido como ndice de tabla el campo date, esto es necesario si luego
queremos particionar por fecha.
2.- Ahora que tenemos la tabla creada vamos a particionar por mes:
ALTER TABLE reports PARTITION BY RANGE(TO_DAYS(date))(

PEDRO HERNANDEZ AGUIAR

ADMINISTRACION DE BASE DE DATOS


PARTITION
PARTITION
PARTITION
PARTITION
PARTITION
PARTITION
PARTITION
PARTITION
);

L.I. NICOLAS CABRERA HIDALGO

p201111 VALUES LESS THAN (TO_DAYS("2011-12-01")),


p201112 VALUES LESS THAN (TO_DAYS("2012-01-01")),
p201201 VALUES LESS THAN (TO_DAYS("2012-02-01")),
p201202 VALUES LESS THAN (TO_DAYS("2012-03-01")),
p201203 VALUES LESS THAN (TO_DAYS("2012-04-01")),
p201204 VALUES LESS THAN (TO_DAYS("2012-05-01")),
p201205 VALUES LESS THAN (TO_DAYS("2012-06-01")),
pDefault VALUES LESS THAN MAXVALUE

La ltima particin (pDefault) tendr todos los registros que no entren en las particiones
anteriores. De esta manera nos aseguramos que la informacin nunca dejar de insertarse en la
tabla.

Borrar particiones
Lo bueno de trabajar con particiones es que podemos borrar rpidamente registros sin tener que
recorrer toda la tabla e inmediatamente recuperar el espacio en disco utilizado por la tabla.
Por ejemplo si queremos borrar la particin ms antigua simplemente ejecutamos:
ALTER TABLE reports DROP PARTITION p201111;

Aadir particiones
En el ejemplo anterior las 2 ltimas particiones creadas han sido:
PARTITION p201205 VALUES LESS THAN (TO_DAYS("2012-06-01")),
PARTITION pDefault VALUES LESS THAN MAXVALUE
El problema es que todos los INSERTs que se hagan despus de mayo de 2012 se insertarn
en pDefault. La solucin sera aadir particiones nuevas para cubrir los prximos meses:
ALTER TABLE reports REORGANIZE PARTITION pDefault INTO (
PARTITION p201206 VALUES LESS THAN (TO_DAYS("2012-07-01")),
PARTITION pDefault VALUES LESS THAN MAXVALUE);

En el caso que no tuvieramos una particin del tipo pDefault simplemente ejecutamos:
ALTER TABLE reports ADD PARTITION (PARTITION p201206 VALUES LESS THAN (TO_DAYS("2012-0701")));

Consultar particiones
Para consultar informacin de particiones creadas en una tabla as como tambin los registros que
contiene cada una ejecutamos:

PEDRO HERNANDEZ AGUIAR

ADMINISTRACION DE BASE DE DATOS


SELECT
PARTITION_NAME,TABLE_ROWS
TABLE_NAME='reports';

L.I. NICOLAS CABRERA HIDALGO


FROM

information_schema.PARTITIONS

WHERE

Particiones postgreSQL
Para qu sirve?

Reduce la cantidad de datos a recorrer en cada consulta SQL

Aumenta el rendimiento (Menos datos que recorrer => execucin ms rpida).

En que consiste?

Segmentacin de la informacin mediante criterios.

Cales son los Criterios?

Por definiciones exactas.

Por rangos.

Cundo se debe aplicar?

Cuando existen tablas con gran volmen de datos.

Para asignar permisos a un grupo de datos especfico de una tabla.

Cules son las modalidades de aplicacin?

Horizontal: Segmentar datos por filas

Vertical: Segmentar datos por columnas

Y las Ventajas?

Trabajamos con segmentos de datos ms pequeos.

Obtenemos ndices ms pequeos.

Realizamos los backups ms rpidos.

En conclusin, la particin de tablas es una forma de organizar los datos clasificandolas segn criterios de
agrupacin, de manera que cada transaccin realizada en una tabla padre se redirija automticamente a un
menor grupo de datos que estn agrupados en las tablas hijas, el inters radica a la hora de realizar las consultas
con un ahorro significativo en el tiempo de respuesta.

PEDRO HERNANDEZ AGUIAR

ADMINISTRACION DE BASE DE DATOS

L.I. NICOLAS CABRERA HIDALGO

Segn el esquema mostrado, si quisiramos realizar una consulta en la tabla Transporte y sta no estara
particionada, se tendra que barrer todos los registros al realizar la bsqueda, pero al tener particionada la tabla
la consulta se reducira a aplicarse nicamente en alguna de las particiones, por consecuencia, sobre un menor
nmero de datos.
Postgresql maneja los particionamientos de tablas basndose en la teoria de herencias, por lo cual debemos
crear tablas el nmero de veces segn particiones queramos realizar.
CASO PRCTICO:
1) Realizar el Particionamiento de la tabla Postulante por IDPerAcad:
Para mantener organizado nuestras particiones crearemos un nuevo esquema y dentro de ste las particiones
que vayamos creando.
ELIMINAR TODOS LOS DATOS DE LA TABLA Persona.Postulante
TRUNCATE TABLE Persona.Postulante;

CREAMOS UN ESQUEMA PARA LAS PARTICIONES:


CREATE SCHEMA Particion;

CREAMOS LAS PARTICIONES (Una tabla por cada IDPerAcad existente)


CREATE TABLE Particion.Postulante_2005_1 (CHECK ( IDPerAcad='2005-1' ))
INHERITS (Persona.Postulante);
;;
CREATE TABLE Particion.Postulante_2005_2 (CHECK ( IDPerAcad='2005-2' ))
INHERITS (Persona.Postulante);
;;
CREATE TABLE Particion.Postulante_2006_1 (CHECK ( IDPerAcad='2006-1' ))
INHERITS (Persona.Postulante);
;;

PEDRO HERNANDEZ AGUIAR

ADMINISTRACION DE BASE DE DATOS

L.I. NICOLAS CABRERA HIDALGO

CREATE TABLE Particion.Postulante_2006_2 (CHECK ( IDPerAcad='2006-2' ))


INHERITS (Persona.Postulante);
;;
CREATE TABLE Particion.Postulante_2007_1 (CHECK ( IDPerAcad='2007-1' ))
INHERITS (Persona.Postulante);
;;
CREATE TABLE Particion.Postulante_0000_0 ()
INHERITS (Persona.Postulante);
;;

MTODOS DE PARTICIONAMIENTO (FUNCINES REGLAS)


MTODO 1:
CREACIN DE LA FUNCIN DE PARTICIONAMIENTO:
-- CREATE OR REPLACE FUNCTION Particion.Insert_PerAcad_Function()
-- RETURNS TRIGGER AS $$
-- BEGIN----------

IF ( NEW.IDPerAcad ='2005-1') THEN


INSERT INTO Particion.Postulante_2005_1 VALUES (NEW.*);

ELSIF ( NEW.IDPerAcad ='2005-2') THEN


INSERT INTO Particion.Postulante_2005_2 VALUES (NEW.*);
ELSIF ( NEW.IDPerAcad ='2006-1' ) THEN
INSERT INTO Particion.Postulante_2006_1 VALUES (NEW.*);
ELSIF ( NEW.IDPerAcad ='2006-2' ) THEN
INSERT INTO Particion.Postulante_2006_2 VALUES (NEW.*);
ELSIF ( NEW.IDPerAcad ='2007-1' ) THEN

PEDRO HERNANDEZ AGUIAR

10

ADMINISTRACION DE BASE DE DATOS


---

L.I. NICOLAS CABRERA HIDALGO

INSERT INTO Particion.Postulante_2007_1 VALUES (NEW.*);


ELSE

--

INSERT INTO Particion.Postulante_0000_0 VALUES (NEW.*);

--

END IF;

--

RETURN NULL;

-- END;
-- $$
-- LANGUAGE plpgsql;
-- ;;

CREACIN DEL TRIGGER DE PARTICIONAMIENTO: El siguiente trigger ejecutar la funcin anterior


antes de cada insercin de datos a la tabla Persona.Postulante.
-- CREATE TRIGGER Insert_PerAcad_Trigger
--

BEFORE INSERT ON Persona.Postulante

--

FOR EACH ROW EXECUTE PROCEDURE Particion.Insert_PerAcad_Function()

;;

MTODO 2:
CREACIN DE REGLAS
CREATE OR REPLACE RULE Insert_PerAcad_Ruler_2005_1 AS
ON INSERT TO Persona.Postulante
WHERE (IDPerAcad='2005-1')
DO INSTEAD INSERT INTO Particion.Postulante_2005_1 VALUES(NEW.*);
;;
CREATE OR REPLACE RULE Insert_PerAcad_Ruler_2005_2 AS

PEDRO HERNANDEZ AGUIAR

11

ADMINISTRACION DE BASE DE DATOS

L.I. NICOLAS CABRERA HIDALGO

ON INSERT TO Persona.Postulante
WHERE (IDPerAcad='2005-2')
DO INSTEAD INSERT INTO Particion.Postulante_2005_2 VALUES(NEW.*);
;;
CREATE OR REPLACE RULE Insert_PerAcad_Ruler_2006_1 AS
ON INSERT TO Persona.Postulante
WHERE (IDPerAcad='2006-1')
DO INSTEAD INSERT INTO Particion.Postulante_2006_1 VALUES(NEW.*);
;;
CREATE OR REPLACE RULE Insert_PerAcad_Ruler_2006_2 AS
ON INSERT TO Persona.Postulante
WHERE (IDPerAcad='2006-2')
DO INSTEAD INSERT INTO Particion.Postulante_2006_2 VALUES(NEW.*);
;;
CREATE OR REPLACE RULE Insert_PerAcad_Ruler_2007_1 AS
ON INSERT TO Persona.Postulante
WHERE (IDPerAcad='2007-1')
DO INSTEAD INSERT INTO Particion.Postulante_2007_1 VALUES(NEW.*);
;;
CREATE OR REPLACE RULE Insert_PerAcad_Ruler_0000_0
AS ON INSERT TO Persona.Postulante
WHERE (IDPerAcad NOT IN ('2005-1','2005-2','2006-1','2006-2','2007-1'))
DO INSTEAD INSERT INTO Particion.Postulante_0000_0 VALUES(NEW.*);

PEDRO HERNANDEZ AGUIAR

12

ADMINISTRACION DE BASE DE DATOS

L.I. NICOLAS CABRERA HIDALGO

COMPROBANDO PARTICIONES:
Ejecutar Script: Insertar Postulantes.sql
COMPROBANDO HERENCIA:
Insertando
Insertamos un contacto nuevo:
INSERT INTO Persona.contacto(
Nombres
,Paterno
,Materno
,Genero
,DNI
,FechaNac
,FechaCreacion)
VALUES (
'Anonymous'
,'Anonymous'
,'Anonymous'
,'0'
,'12345678'
,'Nov 14 1987 12:00AM'
,'Dec 18 2005

5:05PM');

;;

Insertamos postulante a partir del contacto nuevo:


INSERT INTO Persona.Postulante(

PEDRO HERNANDEZ AGUIAR

13

ADMINISTRACION DE BASE DE DATOS

L.I. NICOLAS CABRERA HIDALGO

IDPostulante
,IDContacto
,IDCarrera
,IDPerAcad
,IDModalidad
,Puntaje
,AsistioExamen
,Ingreso)
VALUES ('0000000000',176,'310','2009-2',5,75,'1','1');
SELECT * FROM Persona.Postulante WHERE IDContacto=176;
SELECT * FROM Particion.Postulante_0000_0 WHERE IDContacto=176;

Actualizando
SELECT * FROM Persona.Postulante WHERE IDContacto=176;
SELECT * FROM Particion.Postulante_0000_0 WHERE IDContacto=176;
UPDATE Persona.Postulante SET IDContacto=666 WHERE IDContacto=176;
SELECT * FROM Persona.Postulante WHERE IDContacto=666;
SELECT * FROM Particion.Postulante_0000_0 WHERE IDContacto=666;

Eliminando
SELECT * FROM Persona.Postulante WHERE IDContacto=666;
SELECT * FROM Particion.Postulante_0000_0 WHERE IDContacto=666;
DELETE FROM Persona.Postulante WHERE IDContacto=666;
SELECT * FROM Persona.Postulante WHERE IDContacto=666;

PEDRO HERNANDEZ AGUIAR

14

ADMINISTRACION DE BASE DE DATOS

L.I. NICOLAS CABRERA HIDALGO

SELECT * FROM Particion.Postulante_0000_0 WHERE IDContacto=666;

Deshabilitando Herencia
ALTER TABLE Particion.Postulante_2005_1 NO INHERIT Persona.Postulante;
SELECT * FROM Persona.Postulante WHERE IDContacto=1; --Deshabilitado
SELECT * FROM Particion.Postulante_2005_1 WHERE IDContacto=1; --Habilitado

Habilitando Herencia
ALTER TABLE Particion.Postulante_2005_1 INHERIT Persona.Postulante;
SELECT * FROM Persona.Postulante WHERE IDContacto=1; --Habilitado
SELECT * FROM Particion.Postulante_2005_1 WHERE IDContacto=1; --Habilitado

COMPROBANDO

PERFORMANCE

Modo particionado habilitado


SET constraint_exclusion=on;
EXPLAIN SELECT * FROM Persona.Postulante WHERE IDPeracad='2007-2';
--> ""Result

(cost=0.00..33.75 rows=6 width=116)"

Modo particionado deshabilitado


SET constraint_exclusion=off;
EXPLAIN SELECT * FROM Persona.Postulante WHERE IDPeracad='2007-2';
--> "Result

(cost=0.00..118.12 rows=21 width=116)"

Cosulta directa en la particin


EXPLAIN SELECT * FROM Particion.Postulante_0000_0 WHERE IDPeracad='2007-2';
--> "Result (cost=0.00..16.88 rows=3 width=116)"

PEDRO HERNANDEZ AGUIAR

15

ADMINISTRACION DE BASE DE DATOS

L.I. NICOLAS CABRERA HIDALGO

LIMITACIONES
1)NO

FUNCIONA

EL

UPDATE

EN

CAMPOS

CON

RESTRICCIONES:

Cuando queremos actualizar los idperacad=2005-1 a 2009-1 se produce un error de violacin de


restricciones:

<<ERROR: new row for relation postulante_2005_1 violates check constraint


postulante_2005_1_idperacad_check>>
Esto sucede porque el idperacad 2005-1 intenta actualizarse a 2009-1 sobre la misma particin
postulante_2005_1, y obviamente esta particin tiene restringido cualquier otro idperacad que no sea 2005-1.
UPDATE Persona.Postulante SET IDPeracad='2009-2' WHERE IDPeracad='2005-1';
UPDATE Particion.Postulante_2005_1 SET IDPeracad='2009-2';

El error se produce por las ltimas restricciones asignadas al momento de crear cada particin:

<<CREATE TABLE Particion.Postulante_2005_1


(CHECK ( IDPerAcad=2005-1 )) INHERITS (Persona.Postulante);>>
Por esa razn actualizamos la tabla quitndole esa restriccin:
ALTER TABLE Particion.Postulante_2005_1
DROP CONSTRAINT postulante_2005_1_idperacad_check;
;;
ALTER TABLE Particion.Postulante_2005_2
DROP CONSTRAINT postulante_2005_2_idperacad_check;
;;
ALTER TABLE Particion.Postulante_2006_1
DROP CONSTRAINT postulante_2006_1_idperacad_check;
;;
ALTER TABLE Particion.Postulante_2006_2
DROP CONSTRAINT postulante_2006_2_idperacad_check;
;;

PEDRO HERNANDEZ AGUIAR

16

ADMINISTRACION DE BASE DE DATOS

L.I. NICOLAS CABRERA HIDALGO

ALTER TABLE Particion.Postulante_2007_1


DROP CONSTRAINT postulante_2007_1_idperacad_check;
;;

Quitarle las restricciones a la tablas hijas hizo que las distribuciones de idperacads no sean correctas
Esto

permitir

que

en

en

una

tabla

hija

existan

ipderacads

que

no

corresponden.

Volvemos a intentar actualizar:


SELECT * FROM Particion.Postulante_2005_1;
UPDATE Persona.Postulante SET IDPeracad='2009-2' WHERE IDPeracad='2005-1';
SELECT * FROM Particion.Postulante_2005_1; --No debera pasar esto.
UPDATE Particion.Postulante_2005_1 SET IDPeracad='2005-1'; --Restablecemos
idperacad
SELECT * FROM Particion.Postulante_2005_1;

Posible solucin:
SELECT * FROM Particion.Postulante_2005_1;
UPDATE Persona.Postulante SET IDPeracad='2009-2' WHERE IDPeracad='2005-1';
SELECT * FROM Particion.Postulante_2005_1;
INSERT INTO Particion.Postulante_0000_0
(SELECT * FROM Persona.Postulante WHERE IDPeracad='2009-2');
SELECT * FROM Particion.Postulante_0000_0;
DELETE FROM Particion.Postulante_2005_1 WHERE IDPeracad='2009-2';
SELECT * FROM Particion.Postulante_2005_1;

2)DELETE/UPDATE/INSERT PASAN POR ALTO DESHABILITACIN DE HERENCIA:


ALTER TABLE Particion.Postulante_2006_2 NO INHERIT Persona.Postulante;
SELECT * FROM Persona.Postulante WHERE IDContacto=100; --Deshabilitado

PEDRO HERNANDEZ AGUIAR

17

ADMINISTRACION DE BASE DE DATOS

L.I. NICOLAS CABRERA HIDALGO

SELECT * FROM Particion.Postulante_2006_2 WHERE IDContacto=100; --Habilitado


UPDATE Particion.Postulante_2006_2 SET IDContacto=777 WHERE IDContacto=100;
SELECT * FROM Particion.Postulante_2006_2 WHERE IDContacto=777; --Habilitado
SELECT * FROM Persona.Postulante WHERE IDContacto=777; --Deshabilitado
ALTER TABLE Particion.Postulante_2006_2 INHERIT Persona.Postulante;
SELECT * FROM Persona.Postulante WHERE IDContacto=777; --Habilitado

A pesar de haber estado deshabilitado actualiz el registro.


Los mismo sucede con INSERT Y DELETE.

PEDRO HERNANDEZ AGUIAR

18

ADMINISTRACION DE BASE DE DATOS

L.I. NICOLAS CABRERA HIDALGO

Conclusin
La estructura es ampliamente usada para grabar las modificaciones de la base de datos es
la Bitcora, herramienta que permite registrar, analizar detectar y notificar eventos que
suceden en cualquier sistemas de informacin utilizado en las organizaciones. La estructura
ms ampliamente usada para grabar las modificaciones de la BD.

Bibliografa
http://chavez-atienzo-2013.blogspot.in/2013/03/bitacora.html
http://dan1456bd.blogspot.in/p/la-diferencia-entre-un-disco-o.html
http://dan1456bd.blogspot.in/p/particiones-en-mysql-y-oracle.html
https://prezi.com/jgbmph6gircw/bitacoras-y-particiones/
http://chavez-atienzo-2013.blogspot.in/2013/03/particiones-en-mysql.html
http://tavoberry.com/blog/crear-una-bitacora-en-mysql/
https://www.scribd.com/doc/217317964/Bitacoras-PostgreSQL
https://saforas.wordpress.com/2009/11/27/postgresql-particionamiento-de-tablas/
http://chavez-atienzo-2013.blogspot.mx/2013/03/bitacora.html

PEDRO HERNANDEZ AGUIAR

19

Вам также может понравиться