Tenga en cuenta que inserted, deleted
significa lo mismo que inserted CROSS JOIN deleted
y ofrece todas las combinaciones de cada fila. Dudo que esto es lo que quieres.
Algo como esto puede ayudar a empezar ...
SELECT
CASE WHEN inserted.primaryKey IS NULL THEN 'This is a delete'
WHEN deleted.primaryKey IS NULL THEN 'This is an insert'
ELSE 'This is an update'
END as Action,
*
FROM
inserted
FULL OUTER JOIN
deleted
ON inserted.primaryKey = deleted.primaryKey
Dependiendo de lo que quiere hacer, a continuación referencia a la tabla le interesa con inserted.userID
o deleted.userID
, etc. .
Por último, tenga en cuenta que inserted
y deleted
son tablas y pueden (y lo hacen) contener más de un registro.
Si inserta 10 registros a la vez, la tabla inserted
contendrá TODOS los 10 registros. Lo mismo se aplica a las eliminaciones y a la tabla deleted
. Y ambas tablas en el caso de una actualización.
EDITAR Examplee gatillo después PO edición.
ALTER TRIGGER [dbo].[UpdateUserCreditsLeft]
ON [dbo].[Order]
AFTER INSERT,UPDATE,DELETE
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
UPDATE
User
SET
CreditsLeft = CASE WHEN inserted.UserID IS NULL THEN <new value for a DELETE>
WHEN deleted.UserID IS NULL THEN <new value for an INSERT>
ELSE <new value for an UPDATE>
END
FROM
User
INNER JOIN
(
inserted
FULL OUTER JOIN
deleted
ON inserted.UserID = deleted.UserID -- This assumes UserID is the PK on UpdateUserCreditsLeft
)
ON User.UserID = COALESCE(inserted.UserID, deleted.UserID)
END
Si PrimaryKey de UpdateUserCreditsLeft
es algo distinto de identificación de usuario, el uso que en el FULL OUTER JOIN en su lugar.
* También * incorrecto porque puede haber varias filas en estas tablas, por lo que intentar leer un valor en una variable le dará uno de los valores de esa fila (cuál no está definido). –
Además de escribir un mensaje que cree que solo se cambiará una fila, lo cual es una práctica incorrecta, ha utilizado combinaciones implícitas que también son antipatrón sql. Nunca use uniones implícitas. En este momento tienes una combinación cruzada que probablemente no querías.Es inexcusable escribir dicho código casi 20 años después de que las uniones implícitas fueran reemplazadas por las combinaciones mucho mejores explícitas. – HLGEM