Últimas noticias
Loading...

Últimos artículos

miércoles, 2 de abril de 2008
SQL Server: Metadatos (II) - Aplicación práctica - Vaciar base de datos

SQL Server: Metadatos (II) - Aplicación práctica - Vaciar base de datos

Continuando con el artículo en el que hablaba de la utilidad de los Metadatos para obtener información de nuestra base de datos, vamos a escribir un procedimiento almacenado cuya finalidad será la de vaciar todo el contenido (datos) de nuestra base de datos.

Este procedimiento resultará muy útil en aquellas bases de datos que contengan multitud de tablas relacionadas entre si. En estos casos, nos vemos obligados a ir eliminando los datos tabla a tabla, respetando las reglas de integridad, lo cual se convierte en una tarea muy complicada. Para automatizar este proceso seguiremos los siguientes pasos:

  1. Deshabilitar las restricciones de cada tabla de la base de datos.
  2. Vaciar los registros de las distintas tablas de la base de datos.
  3. Volver a habilitar las restricciones definidas en las tablas de la base de datos.
Y por supuesto, realizar una copia de seguridad de nuestra base de datos antes de ejecutar el script, por si algo fuese mal. Además como medida de seguridad adicional, podemos incluir al inicio del script, la instrucción Use, con tal de seleccionar la BBDD en la que queremos trabajar:

Use [miBaseDeDatos]

1. Deshabilitar restricciones de las tablas de la BBDD.

Para ello vamos a recorrer todas las restricciones de nuestra base de datos con la ayuda de la información contenida en information_schema.table_constraints. Además vamos a aprovechar para deshabilitar cada restricción a medida que vamos recorriendo el cursor.

DECLARE CURSOR_ALTER
CURSOR FOR
SELECT 'ALTER TABLE ' + TABLE_NAME + ' NOCHECK CONSTRAINT ' + CONSTRAINT_NAME, TABLE_NAME, CONSTRAINT_NAME
FROM information_schema.table_constraints
ORDER BY TABLE_NAME, CONSTRAINT_NAME
OPEN CURSOR_ALTER FETCH NEXT FROM CURSOR_ALTER INTO @PROXIMA_SENTENCIA, @NOM_TABLA, @NOM_CONSTRAINT
WHILE @@FETCH_STATUS = 0
BEGIN
exec (@PROXIMA_SENTENCIA)
FETCH NEXT FROM CURSOR_ALTER INTO @PROXIMA_SENTENCIA , @NOM_TABLA, @NOM_CONSTRAINT
END
/* Libera la memoria */
CLOSE CURSOR_ALTER
DEALLOCATE CURSOR_ALTER

07/05/2013 Actualización

En las nuevas versiones de SQL Server (yo lo he probado en SQL Server 2012), se puede ejecutar el siguiente script para realizar la misma tarea:


-- Deshabilitar
EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"
 
-- Habilitar
exec sp_msforeachtable @command1="print '?'", @command2="ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"


2. Vaciar los registros de las distintas tablas de la base de datos.

De igual forma que en el paso anterior, vamos a recorrer todas las tablas de nuestra base de datos y eliminar sus registros. Para ello, utilizaremos la información que nos brinda information_schema.tables. Es muy importante que limitemos de alguna forma las tablas que se van a vaciar, por ejemplo, si las tablas de nuestra aplicación empiezan por TBL_ podríamos especificar en la condición WHERE que filtre por aquellas tablas que empiezan con este nombre. En el código que tenemos a continuación, se eliminarán los registros de todas las tablas excepto de sysdiagrams.

DECLARE CURSOR_DELETE
CURSOR FOR
SELECT 'DELETE FROM ' + TABLE_NAME, TABLE_NAME
FROM information_schema.tables
WHERE TABLE_NAME not like 'sysdiagrams'
ORDER BY TABLE_NAME
OPEN CURSOR_DELETE FETCH NEXT FROM CURSOR_DELETE INTO @SQL_DELETE, @NOM_TABLA
WHILE @@FETCH_STATUS = 0
BEGIN
exec (@SQL_DELETE)
FETCH NEXT FROM CURSOR_DELETE INTO @SQL_DELETE, @NOM_TABLA
END
/* Libera la memoria */
CLOSE CURSOR_DELETE
DEALLOCATE CURSOR_DELETE
3. Habilitar restricciones de las tablas de la BBDD.
Vamos a realizar el proceso inverso al seguido en el paso 1. De nuevo, haremos uso de la información contenida en information_schema.table_constraints. En este caso, utilizaremos la instrucción CHECK CONSTRAINT, que vuelve a activar la restricción.
DECLARE CURSOR_ALTER
CURSOR FOR
SELECT 'ALTER TABLE ' + TABLE_NAME + ' CHECK CONSTRAINT ' + CONSTRAINT_NAME, TABLE_NAME, CONSTRAINT_NAME
FROM information_schema.table_constraints
ORDER BY TABLE_NAME, CONSTRAINT_NAME
OPEN CURSOR_ALTER FETCH NEXT FROM CURSOR_ALTER INTO @PROXIMA_SENTENCIA, @NOM_TABLA, @NOM_CONSTRAINT
WHILE @@FETCH_STATUS = 0
BEGIN
exec (@PROXIMA_SENTENCIA)
FETCH NEXT FROM CURSOR_ALTER INTO @PROXIMA_SENTENCIA , @NOM_TABLA, @NOM_CONSTRAINT
END
/* Libera la memoria */
CLOSE CURSOR_ALTER
DEALLOCATE CURSOR_ALTER


Una vez ejecutados los tres pasos, habremos vaciado toda la información de nuestra base de datos. Como recomendación, se deberían limitar aquellas tablas de las que vamos a borrar los registros mediante la correspondiente instrucción dentro de la clausula WHERE (en el paso 2). También es interesante incluir comentarios y sentencias print que nos den una idea de la acción que esta realizando en cada momento el script, y de aquellas tablas que han sufrido cambios.
martes, 22 de enero de 2008
Libros

Libros

No todo iba a ser programación... Aprovecho este blog para añadir algunos libros que he leído, así como una valoración (muy personal) del mismo. Que nadie piense que quiero hacer critica literaria, simplemente quiero reflejar si me ha gustado.
Juan Eslava Galán
En busca del Unicornio.
La novela, ambientada a fines del siglo XV, narra la historia de un personaje ficticio a quien se envía en busca del cuerno del unicornio, que se supone aumentará la virilidad del rey Enrique IV de Castilla, llamado el Impotente. En la trama argumental, habilísima y muy amena, dentro de una escrupulosa fidelidad a la ambientación histórica, se suceden las más curiosas e inesperadas peripecias, siempre con un fondo emotivo y poético que da fuerza y encanto mítico al relato. El autor ha logrado un estilo que es un maravilloso equilibrio entre la soltura y agilidad narrativa y el sabor arcaico que requería el tema. En suma, una deliciosa novela de aventuras en donde coexisten lo fantástico, lo humorístico y lo dramático.
10/10
Ken Follet
Los pilares de la Tierra.
El gran maestro de la narrativa y el suspense nos transporta a la Edad Media, a un fascinante mundo de reyes, damas, caballeros, pugnas feudales, castillos y ciudades amuralladas. El amor y la muerte se entrecruzan vibrantemente en este magistral tapiz cuyo centro es la construcción de una catedral gótica. La historia se inicia con el ahorcamiento público de un inocente y finaliza con la humillación de un rey. Los pilares de la tierra es la obra maestra de Ken Follett y constituye una excepcional evocación de una época de violentas pasiones.
10/10
Matilde Asensi
Iacobus.
Galcerán de Born; monje de una orden militar, es enviado por el papa Juan XXII a investirgar la misteriosa muerte de su antecesor Clemente V y la del rey Feliope IV de Francia, tras la ejecución del Gran Maestre de la Orden del Temple. a partir de aquí se inicia una vertiginosa aventura que nos conducirá de la sede papal de Aviñon a París y de allí, a lo largo del Camino de santiago, hasta el confín del mundo, Finisterre.
9/10
El último Catón.
Tras el éxito de El salón de ámbar e Iacobus, Matilde Asensi nos presenta una nueva novela tan impactante como aquellas. Todo comienza cuando una científica que trabaja para el Vaticano es llamada para descifrar las extrañas señales aparecidas en el cuerpo de un etíope fallecido en extrañas circunstancias. A partir de aquí se desplegará una trama trepidante y que pondrá al descubierto una siniestra conspiración para atentar contra las reliquias más sagradas de la Iglesia.
9/10
Todo bajo el cielo.
Elvira, una pintora española afincada en el París de las vanguardias, recibe la noticia de que su marido, con el que está casada por amistad, ha muerto en su casa de Shanghai en extrañas circunstancias.
Acompañada por su sobrina, zarpa desde Marsella en barco para recuperar el cadáver de Remy sin saber que éste es sólo el principio de una gran aventura por China en busca del tesoro del Primer Emperador. Sin tiempo para reaccionar se verá perseguida por los mafiosos de la Banda Verde y los eunucos imperiales, y contará con la ayuda del anticuario Lao Jiang y su sabiduría oriental en un gran recorrido que les llevará desde Shangai hasta Xián.
8/10
John Boyne
El niño con el pijama de rayas.
Aunque el uso habitual de un texto como éste es describir las características de la obra, por una vez nos tomaremos la libertad de hacer una excepción a la norma establecida. No sólo porque el libro que tienes en tus manos es muy difícil de definir, sino porque estamos convencidos de que explicar su contenido estropearía la experiencia de la lectura. Creemos que es importante empezar esta novela sin saber de qué trata.
No obstante, si decides embarcarte en la aventura, debes saber que acompañarás a Bruno, un niño de nueve años, cuando se muda con su familia a una casa junto a una cerca. Cercas como ésa existen en muchos sitios del mundo, sólo deseamos que no te encuentres nunca con una. Por último, cabe aclarar que este libro no es sólo para adultos; también lo pueden leer, y sería recomendable que lo hicieran, niños a partir de los trece años de edad.
7/10
Eduardo Mendoza
El asombroso viaje de Pomponio Flato
En el siglo I de nuestra era, Pomponio Flato viaja por los confines del Imperio romano en busca de unas aguas de efectos portentosos. El azar y la precariedad de su fortuna lo llevan a Nazaret, donde va a ser ejecutado el carpintero del pueblo, convicto del brutal asesinato de un rico ciudadano. Muy a su pesar, Pomponio se ve inmerso en la solución del crimen, contratado por el más extraordinario de los clientes: el hijo del carpintero, un niño candoroso y singular, convencido de la inocencia de su padre, hombre en apariencia pacífico y taciturno, que oculta, sin embargo, un gran secreto. Cruce de novela histórica, novela policíaca, hagiografía y parodia de todas ellas, 'El asombroso viaje de Pomponio Flato' es la obra más insólita e inesperada de Eduardo Mendoza, y también una de las más ferozmente divertidas. Como en el Quijote se ponían en solfa los libros de caballerías, aquí se ajustan las cuentas a muchas novelas de consumo, y se construye, al mismo tiempo, una nueva modalidad del género más característico de Eduardo Mendoza: la trama detectivesca original e irónica, que desemboca en una sátira literaria y en una desternillante creación de inagotable vitalidad novelesca.
8/10
HermanHesse Hermann Hesse
siddhartha1 Siddharta.
Novela de aprendizaje espiritual del hijo de un brahman. Se trata más de una novela de evolución interior que de una novela de acción. A través del encuentro con diferentes personajes, asistimos al desarrollo personal del protagonista hacia la pureza espiritual y la paz interior.
8/10
flann.obrien Flann O'Brien
lavidadura La vida dura. Una exégesis de lo escuálido.
A la casa del disputador señor Collopy arriban dos niños huérfanos. Mientras el señor Collopy se dedica a una misteriosa y humanitaria labor en favor de las mujeres, los chicos crecen entre los aromas del buen whisky y de la mala cocina. Manus, el hermano, pronto demuestra ser un maestro en los negocios. Con virtuoso y cruel ingenio, Flann O' Brien nos ofrece un argumento a escala clásica; su economía es incomparable, su inventiva desbordante.
6/10
Fuente comentarios:http://www.lecturalia.com/
martes, 25 de septiembre de 2007
Reflection con VB.Net (I): Instanciar objetos

Reflection con VB.Net (I): Instanciar objetos

En algunas ocasiones, podemos querer crear objetos de forma dinámica, de forma que no necesitemos conocer el nombre de la clase a instanciar durante el desarrollo. Para ello, podemos utilizar las clases del namespace Reflection.

Vamos a realizar un ejemplo en el que queremos instanciar una clase de la que no conocemos el nombre, y que dicha clase tiene que ejecutar un método X que devolverá un resultado en una propiedad Y. Definimos un formulario web con 5 textBox y un botón:


  1. txtLibreria: dónde se encuentra la clase.
  2. txtClase: nombre de la clase a instanciar
  3. txtMetodo: nombre del método a ejecutar
  4. txtPropiedad: propiedad que contiene el resultado
  5. txtResultado: mostrará el resultado obtenido
  6. btnEjecutar: ejecuta el método
Para simplificar el ejemplo, consideramos las siguientes restricciones:
  • El método no tiene parámetros
  • La propiedad que contiene el resultado es de tipo String

En el evento onClick del botón, insertamos el siguiente código:


Dim
objectType As Type = Type.GetType(txtLibreria.Text + "." + txtClase.Text + ", " + txtLibreria.Text, True) Dim myObject As Object = Activator.CreateInstance(objectType) ' Crea la instancia del objeto Dim mi As Reflection.MethodInfo = myObject.GetType().GetMethod( txtMetodo.Text) mi.Invoke(myObject, Nothing) ' Invoca al método (sin parámetros)
Dim pi As Reflection.PropertyInfo = myObject.GetType.GetProperty( txtPropiedad)
Dim strResultado As String = pi.GetValue(myObject, Nothing) ' Recupera el valor de la propiedad
txtResultado.Text = strResultado
En siguientes entregas, veremos la forma de llamar a un método con parámetros, y de obtener toda la información de una clase.
Referencias:
jueves, 12 de julio de 2007
SQL Server: Metadatos (I) - Procedimientos Almacenados

SQL Server: Metadatos (I) - Procedimientos Almacenados

Cuando una base de datos alcanza un tamaño significativo en lo relativo a procedimientos almacenados, se hace muy complicado tener una visión general de dichos procedimientos junto con los parámetros que aceptan. Es por ello que sería muy interesante obtener todos los procedimientos junto con sus parámetros y tipos de datos en una consulta SQL, con el fin de poder tratar esta información desde una aplicación externa, por ej. desde Excel o Access.
SQL Server nos brinda esta información en lo que se suele denominar metadata. Dentro del espacio INFORMATION_SCHEMA encontramos información relativa a los objetos de la base de datos. Para el caso que nos ocupa, utilizaremos la tabla PARAMETERS:

SELECT SPECIFIC_SCHEMA, SPECIFIC_NAME, PARAMETER_NAME, DATA_TYPE, PARAMETER_MODE
FROM INFORMATION_SCHEMA.PARAMETERS
WHERE
OBJECTPROPERTY ( OBJECT_ID ( QUOTENAME(SPECIFIC_SCHEMA) + '.' + QUOTENAME(SPECIFIC_NAME) ), 'IsMsShipped' ) = 0
Ejecutando la SQL en nuestra base de datos, obtendremos todos los procedimientos almacenados del sistema ordenados por la fecha de última modificación (descendente).

viernes, 25 de mayo de 2007
Regenerar identity en SQL Server

Regenerar identity en SQL Server

En ocasiones nos encontramos con una tabla que contiene datos y queremos vaciarla y volverla a rellenar por algún motivo. Si la tabla tiene una columna identity, al rellenarla de nuevo, empezará por el último identificador que tenía asignado. Para inicializar de nuevo la columna identity ejecutaremos la siguiente instrucción desde una consola de SQL:
 dbcc checkident (nombre_tabla, reseed , 0)

Quick Message
Press Esc to close
Copyright © 2013 Apaga y vámonos All Right Reserved