viernes, marzo 30, 2007

CLR Triggers


Todos en algun momento hemos tenido que hacer algun trigger en alguna tabla, pero que pasa si este trigger requiere de mucho procesamiento, SQL no esta diseñado para hacer mucho procesamiento, entonces la opcion es crear un Trigger CLR, este aparta de que se escribe con lenguaje .NET puede optimizar el uso de recursos

Cuando se vaya a tomar la decision de hacer un Trigger T-Sql o CLR se debe pensar primero en la complejidad del mismo

Una vez que tomamos la decision de que nuestro trigger empezemos a checar la sintaxis para crear un Trigger T-Sql

CREATE TRIGGER nombre ON tabla FOR evento AS sentencia_sql

Para poder crear nuestro Trigger CLR es necesario tener una sintaxis parecida pero solo con una pequela diferencia donde se deberia especificar la sentancia sql vamos a usar EXTERNAL NAME y la direcion de nuestro metodo; con lo cual nuestra sintaxis quedarioa así:

CREATE TRIGGER nombre ON tabla FOR evento AS EXTERNAL NAME ensamblado.[namespace.clase].metodo

donde en el apartado entre corchetes puede agregarse una cantidad n de namespaces

El punto que hay que ver a continuacion es el como crear el metodo que sera el Trigger, el cual puede quedar asi

Primero, la importacion de namespaces que vamos a utilizar

Imports System
Imports System.Data.SqlClient
Imports System.Data.SqlTypes
Imports Microsoft.SqlServer.Server
Imports System.Transactions

Despues hay que crear una clase donde poner el Trigger; hecho esto hay que declarar que el metodo que estamos a punto de hacer es un Trigger

Public Class Triggers
_

Public Shared Sub trig ()

Despues vamos a utilizar un sqlConnection el cual va a utilizar una conexion contextual

Using connection As New SqlConnection("context connection=true")

Hacemos la logica de negocios que tengamos que hacer y compilamos; el metodo debera de quedar algo asi

Imports System
Imports System.Data.SqlClient
Imports System.Data.SqlTypes
Imports Microsoft.SqlServer.Server
Imports System.Transactions

Partial Public Class Triggers
_
Public Shared Sub trig()
Using connection As New SqlConnection("context connection=true")

Dim command As SqlCommand
Dim reader As SqlDataReader
Dim value As Integer

connection.Open()

command = New SqlCommand("SELECT * FROM INSERTED", connection)
reader = command.ExecuteReader()
reader.Read()
value = CType(reader(0), Integer)
reader.Close()

If value = 1 Then

Try

Dim trans As Transaction
trans = Transaction.Current
trans.Rollback()

Catch ex As SqlException

' Catch the exception.
End Try
Else

End If

connection.Close()
End Using
End Sub
End Class
Ya que tenemos nuestro propio ensamblado solo es cuestion se subirlo a SQL, hay que recordar que esta es una función nueva de SQL Server 2005, es cuestion de elegir del browser la base de datos deseada, abrir la seccion de programabilidad y ahi a la seccion de ensamblados; una vez ya localizada esta seccion es cuestion de dar boton derecho con el mouse y elegir nuevo ensamblado

Una vez abierta abierta la ventana para agregar un nuevo ensamblado elegimos el nuestro y damos click en aceptar, una vez hecho esto creamos un nuevo query, con la sintaxis que mencione al principio

CREATE TRIGGER nombre ON tabla FOR evento AS EXTERNAL NAME ensamblado.[namespace.clase].metodo

Ejecutamos y ya tenemos nuestro Trigger CLR.
Por ultimo vale la pena mencionar que aqui tambein aplican las reglas de las diferencias entre Triggers DDL y DML

No hay comentarios.: