2010-07-29 12 views
10

Me perdí cuando quería crear un desencadenante utilizando el "CREATE TRIGGER" predefinido de SQL Server 2008 R2. ¿Podría darme una declaración SQL directa que pueda usar para crear un disparador, y decirme cómo definir DESPUÉS, ANTES y todo eso?Crear desencadenador en SQL Server

Además, ¿cómo puedo saber las filas ACTUALIZADAS/INSERTADAS/ELIMINADAS, y utilizar sus valores de columna para realizar operaciones dentro del activador?

+0

@ John: El producto se llama "SQL Server", no "MSSQL". "MSSQL" se puede confundir fácilmente con "MySQL". Además, al hacer una pregunta sobre SQL Server, sugiero que use la etiqueta "sql-server". "sql" es para preguntas generales sobre el lenguaje SQL. –

+0

Ok gracias por la nota. Lo haré. – johnshaddad

+0

¿Su pregunta es simplemente sobre cómo definir un desencadenante o cómo escribir un activador que puede usar para operar en las filas afectadas? Si es el último, entonces debería considerar reformular su pregunta. – Thomas

Respuesta

2

Las bases de datos están orientadas a conjuntos y los activadores no son diferentes. Se disparará un disparador cuando se realice una operación determinada y esa operación pueda afectar a varias filas. Por lo tanto, la pregunta "Say I want to know the Primary Key of that row" es un nombre inapropiado. Podría haber múltiples filas insertadas.

SQL Server proporciona dos tablas especiales para los desencadenadores DESPUÉS llamados inserted y deleted que representan las filas que fueron insertadas o eliminadas por una acción y están estructuradas de forma idéntica a la tabla afectada. Un desencadenador de actualización podría rellenar inserted y deleted mientras que un desencadenador de inserción solo llenaría la tabla inserted.

de:

pero el destinatario de correo electrónico se decide en función de un valor en una segunda tabla, donde se encuentra la clave de identificación extranjera en la primera tabla (que es el que tiene el gatillo

La respuesta a esta pregunta es utilizar la tabla inserted (que nuevamente, debe suponer que podría tener varias filas) para recorrer las filas y enviar un correo electrónico. Sin embargo, recomendaría no poner lógica de correo electrónico en un desencadenador. , Recomendaría poner esa lógica en un procedimiento almacenado y enviar su correo desde t sombrero.

Como referencia: Create Trigger

+0

¿Y luego llamar a ese procedimiento desde el gatillo? ¿Es eso lo que quieres decir?Pero, ¿no es el procedimiento del sistema de correo de sql suficiente para manejar eso en el desencadenante? ¿o debería crear un procedimiento que llame a ese procedimiento del sistema y luego llamar a este procedimiento en el desencadenante? – johnshaddad

+0

@johnshaddad - No. No haría operaciones de correo electrónico desde un desencadenador. En cambio, su código de llamada usaría el proceso almacenado en lugar de operar directamente contra la tabla. – Thomas

+0

Cuando dijo "Puede haber varias filas insertadas". ¿No dispara el gatillo varias veces? ¿O como? ¿Podrías explicarme cómo iría en ese caso? – johnshaddad

2

Un desencadenador es un proceso basado en eventos que se "desencadena" después de que una tabla se ha modificado de alguna manera. Esto estará en DELETE, UPDATE, INSERT, y así sucesivamente. Su sintaxis ANTES y DESPUÉS definirá si ejecutar el desencadenante antes o después de que se haya confirmado el evento.

Esa es la versión corta. Consulte MSDN.

+0

Sí, estoy familiarizado con los desencadenadores en MySQL pero no en MSSQL, así que pensé que hay una forma diferente de implementación. Gracias! – johnshaddad

+0

Pero, ¿cómo puedo saber qué fila se está actualizando? Supongamos que quiero saber la clave principal de esa fila, ¿cómo puedo hacer eso? Algo así como enviar un correo electrónico después de agregar un nuevo elemento, pero el destinatario del correo electrónico se decidirá en función de un valor en una segunda tabla, donde la ID de clave externa se encuentra en la primera tabla (que es la que tiene el desencadenador) – johnshaddad

+0

mrdenny's comentar en respuesta a la respuesta de Joel Coehoorn es un buen resumen. –

10

La sintaxis básica es

CREATE TRIGGER YourTriggerName ON dbo.YourTable 
FOR|AFTER INSERT, UPDATE, DELETE 
AS 
BEGIN 
    /*Put what ever you want here*/ 
    UPDATE AnotherTable 
      SET SomeColumn = AnotherColumn 
    FROM inserted | deleted 
END 
GO 
+0

Estoy intentando esto y no funciona para mí en el servidor MS. –

Cuestiones relacionadas