Пользуемся триггерами(trigger)
Ранее я писал об использовании Stored Procedures, теперь пришёл черёд триггеров. В отличие от хранимых процедур, триггера я принял сразу. Очень удобная и полезная штука. Если вы хотите отследить вставку, изменение или удаление записи, то триггеры именно для этих задач. Как вы знаете, триггеры можут быть 3 типов(DML): на delete, insert и update; то есть триггер сработает на указанное действие с данными в таблице БД delete, insert или update , в зависимости от его типа. Выполняться он может до(before) или после(after) того действия(delete, insert или update) которое его вызвало. Триггеры before полезны, например, для того, чтобы вы могли предупредить какое либо недопустимое, или несогласованное с логикой бизнесс процесса действие с данными. Он выполняется до вызвавшего его действия, а значит с помощью него можно это действие отменить, проверив данные на валидность с помощью sql statements вашего тригера. Триггеры after, выполняютя после действия, которое его инициировало и полезны, например для логирования изменений данных.
По сути, в триггере вы можете описать набор SQL команд, которые будут выполняться при срабатывании триггера.
Вот так вот коротко о триггерах. Подробнее о триггерах для MS SQL Server тут на MSDN, для MySQL тут
Синтаксис для CREATE
MySQL:
CREATE
[DEFINER = { user | CURRENT_USER }]
TRIGGER trigger_name trigger_time trigger_event
ON tbl_name FOR EACH ROW trigger_stmt
MS SQL:
CREATE TRIGGER [ schema_name . ]trigger_name
ON { table | view }
[ WITH <dml_trigger_option> [ ,...n ] ]
{ FOR | AFTER | INSTEAD OF }
{ [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] }
[ WITH APPEND ]
[ NOT FOR REPLICATION ]
AS { sql_statement [ ; ] [ ,...n ] | EXTERNAL NAME <method specifier [ ; ] > }<dml_trigger_option> ::=
[ ENCRYPTION ]
[ EXECUTE AS Clause ]<method_specifier> ::=
assembly_name.class_name.method_name
К данным о вставляемых строках можно добраться в MS SQL с помощью временной таблицы inserted(select * from inserted вернёт все вставляемые записи), MySQL вставляемую строку содержит переменная NEW(new.field1 — вернёт значение поля field1 вставляемой записи). К удаляемым записям в MS SQL вы получите доступ во временной таблице Deleted, а в MySQL в строке OLD. Следует отметить, что update соответствует удаление старой записи и вставка новой, поэтому при update обе переменные(таблицы inserted/deleted в MS SQL или строки new/old в MySQL) будут не пусты.