RSS : Articles / Comments


Trigger DML - Definicion y notas importantes

22:53, Posted by Gustavo Monaco, No Comment


Pueden sonar similar, pero Tigger y Trigger distan mucho uno del otro. Aunque buscando similitudes, encontramos que ambos responden rápidamente ante estímulos exteriores.

Un trigger o desencadenador, es un objeto de la base de datos que se ejecuta o es desencadenado por un evento. Existen triggers DML (Data Manipulation Language) y DDL (Data Definition Language). En este artículo hablaremos de los Triggers DML. 

Al hablar de DML, hablamos de eventos basados en la manipulación de datos, como lo que sucede cuando hacemos un INSERT, DELETE o UPDATE. La excelente funcionalidad que podemos encontrar en un trigger, es la capacidad de ejecutar scripts al suceder un evento en una tabla. Olvide mencionar que los triggers DML están atados a una tabla o vista.


CREATE TRIGGER trigger_name

   ON  table_name

   AFTER INSERT

AS

BEGIN

 

SELECT B.Name + ' (' + C.FirstName + ' ' + C.LastName + ')' AS CreadoPor

      FROM  INSERTED A INNER JOIN [User] B ON (A.CreatedBy = B.UserId)

                        INNER JOIN  Person C ON (B.PersonId=C.PersonId)

END

Como pueden ver en el ejemplo de código, se define un nombre para el trigger, luego se especifica la tabla sobre la cual va a actuar y se le especifica el evento. Hay dos tipos de eventos: AFTER (después) e INSTEAD OF (en vez de) y hay tres eventos INSERT (insertar), DELETE (borrar) y UPDATE (actualizar). Por lo tanto, podemos efectuar combinaciones dependiendo de nuestras necesidades como: AFTER INSERT, AFTER DELETE,INSTEAD OF INSERT, etc.

Ahora bien, si seguimos analizando el código, se puede observar que se está examinando la tabla INSERTED, la cual posee los registros que han sido insertados, es decir que no necesariamente posee la misma estructura de datos que la tabla principal. Por ejemplo, si se inserta un registro de 3 columnas en una tabla de 5 columnas, en INSERTED encontraremos solo las columnas insertadas. Esto no se puede apreciar muy bien cuando se crea un nuevo registro, sin embargo, es totalmente visible cuando hacemos una actualización. Verán que cuando se trata de un UPDATE, lo que realmente sucede es un DELETE y luego un INSERT, por lo que podemos sacar provecho de la tabla de INSERTED y la de DELETED. Como verán no existe una UPDATED.

Por lo tanto, al momento de trabajar con el evento de UPDATE, se puede trabajar con las tablas de DELETED e INSERTED simultáneamente, otorgando así, una capacidad increíble de Manipulación de Datos.  

En un próximo post, conversaremos sobre los Trigger DDL. Gracias.

Recuperar datos de particiones perdidas o respaldando una particion completa con .dd (Dataset Definition)

12:02, Posted by Gustavo Monaco, One Comment


La razon de este articulo, es una serie de respaldos mal gestionados y formateos de maquinas sin pensar en todas las consecuencias, lo cual me llevo a aprender algo de informática forense y como funcionan los respaldos. 

La idea sería analizar el disco con un programa como TestDisk, el cual te permite hacer una imagen de una particion, copiando a bajo nivel. Esta imagen la puedes guardar en cualquier parte, siempre evitando no tocar el sector del disco al que le estas tomando la imagen, claro... 

TestDisk  genera un archivo llamado image.dd, el cual no esta comprimido ni nada, es simplemente un Ctrl+C y Ctrl+V. Sim embargo, no se puede montar como caulquier .iso porque no todos los programas de imagenes lo soportan, asi que recomiendo MountImage Pro. Con este software, es posible montar la imagen como si fuera otro disco duro y explorar el archivo .dd como si fuera un volumen cualquiera. 

No lo he probado con formateos a bajo nivel, supongo que no funciona, pero con formateos comunes, funciona perfectamente. 

Nota Importante: mientras se hace una imagen a bajo nivel, NUNCA escribir en disco sobre el mismo sector al cual se le hace la imagen... no estoy seguro que sucede, pero tan facil que se cuelga y al reiniciar, no inicia. 

Voy a seguir investigando al respecto, debido a que soy algo torpe y ya me ha tocado estudiar bastante con mis torpezas. 

Gracias.

Matar los procesos de una Base de Datos en especial

21:56, Posted by Gustavo Monaco, No Comment

No se si a ustedes, pero personalmente, en varias ocaciones me ha sucedido que no puedo efectuar una tarea de "Restore" o alguna otra porque la base de datos esta en uso. Con este pequeño script es mas que suficiente para matar a todos esos procesos que impiden tu buena Administracion de la Base de Datos.

--------------------------------------------------------------------------

DECLARE @sql VARCHAR(MAX)

SET @sql = ''

SELECT @sql = @sql + 'KILL ' + CAST(spid AS VARCHAR(10)) + '; '

FROM master.dbo.sysprocesses

WHERE DB_NAME(DBID) = 'Database_name'

EXEC (@sql)

--------------------------------------------------------------------------

Note que Database_name significa el nombre de la base de datos que deseas dejar sin procesos =]


Diccionario de Datos

20:58, Posted by Gustavo Monaco, 2 Comments

Hola a todos. Este es el primer post que escribo en este blog por lo que es un gran honor que les sirva de algo. 

Cada vez que desarrollamos un software, website, o cualquier tipo de aplicativo que maneje una estructura de datos, es NECESARIO, hacer un Diccionario de Datos. Hay diversas formas de hacerlo, yo personalmente ejecuto este script para facilitarme las cosas. 

---------------------------------------------------------------------------------

SELECT      A.[name] TableName,B.[name] ColumnName, DataType=(CASE  C.[name] WHEN 'decimal'   THEN  C.[name] + '(' + CONVERT(VARCHAR(50),B.precision) +','+ CONVERT(VARCHAR(50),B.scale)+')' ELSE  C.[name] + '(' + CONVERT(VARCHAR(50),B.max_length) + ')' END),   is_nullable=(CASE  B.is_nullable WHEN  0     THEN  'Requerido' ELSE  'Nulable'   END),     is_identity=(CASE  B.is_identity WHEN  1     THEN  'Autonumérico' ELSE  'Manual'    END)

FROM  sys.tables A      INNER JOIN  sys.columns B     ON    (A.object_id=B.object_id)

                        INNER JOIN  sys.types   C     ON (B.system_type_id=C.system_type_id)

WHERE A.[name] <> 'sysdiagrams'   

ORDER BY A.[name]

--------------------------------------------------------------------------------- 

Este script lo escribi yo y me es de gran ayuda. Sin embargo, lo mejor sería tener una tabla dentro de la base de datos con todos estos datos y 2 campos adicionales: La descripcion de la Tabla y la descripcion de la columna como tal. Llamese descripcion al nombre en criollo o traduccion a un idioma que conozcamos.