2010-02-11 45 views
29

Tengo un sitio que utiliza el esquema de membresía asp.net. Me gustaría configurar un activador en la tabla aspnet_users que insertó el user_id y el nombre de usuario de la nueva fila en otra tabla.El servidor Sql desencadena valores de inserción desde una nueva fila en otra tabla

¿Cómo hago para obtener los valores de la última inserción?

Puedo seleccionar por el último date_created pero eso parece mal. ¿Hay una mejor manera?

+0

Gracias por las respuestas a todos rápida. – jim

Respuesta

54

probar esto para el servidor SQL

CREATE TRIGGER yourNewTrigger ON yourSourcetable 
FOR INSERT 
AS 

INSERT INTO yourDestinationTable 
     (col1, col2 , col3, user_id, user_name) 
    SELECT 
     'a' , default , null, user_id, user_name 
     FROM inserted 

go 
+2

Tenga en cuenta que una diferencia entre lo que muestro y lo que HLGEM muestra es que proporcioné código para mostrar cómo manejar columnas en la nueva tabla que no sean las extraídas de INSERTED: "a" use una constante literal, "predeterminado" use la tabla definida por defecto o "nulo" no lo define –

+1

Tenga en cuenta que si las 2 tablas son idénticas, ni siquiera necesita enumerar los nombres de las columnas. Muy útil para almacenar una copia estática de solo lectura de una tabla para los registros que pueden cambiar más adelante. –

3

Puede usar OLD y NEW en el disparador para acceder a los valores que han cambiado en ese activador. Mysql Ref

+3

Él _did_ especificó MS SQL, no MySql – Oded

+3

No lo hizo cuando Teja publicó la respuesta. Sin mencionar, nunca está de más saber métodos análogos para otros sistemas. – cmsjr

+0

Era MS Sql, fue editado a SQL Server, como dijo cmsjr ... no duele. – jim

4

Cuando estás en el contexto de un disparador que tienen acceso a la tabla lógica INSERTADO que contiene todas las filas que acaban de ser insertados a la mesa. Puede construir su inserción en la otra tabla en función de una selección de Insertado.

12

Utiliza un disparador de inserción: dentro del activador, los elementos de fila insertados se exponen como una tabla lógica INSERTED, que tiene el mismo diseño de columna que la tabla en la que se define el activador.

Los desencadenantes de eliminación tienen acceso a una tabla lógica similar llamada DELETED.

Los activadores de actualización tienen acceso a una tabla INSERTED que contiene los valores actualizados y una tabla DELETED que contiene los valores que se actualizarán.

5

En un desencadenador de SQL Server tiene disponibles dos psdeuotables llamadas insertadas y eliminadas. Estos contienen los valores antiguos y nuevos del registro.

Así que dentro del disparador (se puede consultar las partes crear gatillo fácil) que haría algo como esto:

Insert table2 (user_id, user_name) 
select user_id, user_name from inserted i 
left join table2 t on i.user_id = t.userid 
where t.user_id is null 

Al escribir disparadores recuerde que actúan una vez en toda la masa de la información, no lo hacen proceso fila por fila. Así que tenga en cuenta las inserciones de múltiples filas en su código.

+2

Note una diferencia entre lo que muestro y lo que KM muestra es que le proporcioné el código para asegurarme de que el registro no existiera en la tabla 2. Él/ella muestra cómo manejar los otros campos requeridos además de los que tiene disponibles en el inserte si hay alguno. – HLGEM

+0

ok, gracias por la aclaración. Aprecio tu tiempo. – jim

Cuestiones relacionadas