Страницы

Поиск по вопросам

суббота, 22 июня 2019 г.

Как создать таблицу истории?

Есть таблица Persons
| ID | Name | Post | | 1 | Kolin | manager | | 2 | Emma | specialist |
Нужно создать копию таблицы - Persons_history котарая отслеживает изменений.
| ID | Name | Post | created_at | created_by | Operation | +----+-------+------------+-----------------------------+------------+-----------+ | 1 | Kolin | manager | 2015-08-06 10:04:28.6000000 | hh\Mark | Insert | | 2 | Emma | specialist | 2015-08-17 17:55:03.6600000 | hh\Mark | Update |
К примеру таблица должна выглядит так. Как можно реализовать? Как создать таблицу истории?


Ответ

Создаём таблички:
IF OBJECT_ID('Persons')IS NOT NULL DROP TABLE Persons IF OBJECT_ID('Persons_History')IS NOT NULL DROP TABLE Persons_History GO
CREATE TABLE Persons( Id INT IDENTITY(1,1), name VARCHAR(255), post VARCHAR(255) )
GO
CREATE TABLE Persons_History( Id INT, name VARCHAR(255), post VARCHAR(255), modify_at DATETIME, modify_by NVARCHAR(255), Operation VARCHAR(6) ) GO
Создание триггеров(можно обойтись и одним на самом деле)
CREATE TRIGGER Persons_History_Trigger_Insert ON Persons AFTER INSERT AS INSERT Persons_History SELECT Id, name, post, GETDATE(), SUSER_SNAME(), 'insert' FROM INSERTED GO CREATE TRIGGER Persons_History_Trigger_Update ON Persons AFTER UPDATE AS INSERT Persons_History SELECT Id, name, post, GETDATE(), SUSER_SNAME(), 'update' FROM INSERTED GO CREATE TRIGGER Persons_History_Trigger_Delete ON Persons AFTER DELETE AS INSERT Persons_History SELECT Id, name, post, GETDATE(), SUSER_SNAME(), 'delete' FROM DELETED GO
DML операции и вывод результата
INSERT Persons VALUES('Kolin', 'manager'),('Emma','specialist')
UPDATE Persons SET name='pegoopik' WHERE id=1
DELETE FROM Persons
SELECT * FROM Persons_History
Ну и результат:
Id name post modify_at modify_by Operation ----------- ---------- ---------- ----------------------- ------------------------------ --------- 2 Emma specialist 2016-01-22 12:12:44.157 ALPHA\XXX-Krasovskiy-EA insert 1 Kolin manager 2016-01-22 12:12:44.157 ALPHA\XXX-Krasovskiy-EA insert 1 pegoopik manager 2016-01-22 12:12:44.160 ALPHA\XXX-Krasovskiy-EA update 2 Emma specialist 2016-01-22 12:12:44.160 ALPHA\XXX-Krasovskiy-EA delete 1 pegoopik manager 2016-01-22 12:12:44.160 ALPHA\XXX-Krasovskiy-EA delete
Можно ещё добавить, что вместо VARCHAR(6) для поля Operation можно хранить код операции, например, в byte. 0-insert; 1-update; 2-delete. Чуть сэкономит место.

Комментариев нет:

Отправить комментарий