Просто приведу другой пример, вот что я использую ...
ОПРЕДЕЛЕНИЕ ТАБЛИЦЫ:
Это обычная таблица, за исключением того, что «основная часть» полей AUDIT находится в таблице HISTORY.
CREATE TABLE [data].[Categories](
[Id] [uniqueidentifier] NOT NULL DEFAULT (newid()),
[Name] [nvarchar](250) NOT NULL,
[Description] [nvarchar](500) NULL,
[DisplayOrder] [bigint] NULL,
[ProductCount] [bigint] NULL,
[IsActive] [bit] NOT NULL CONSTRAINT [DF_Categories_IsActive] DEFAULT ((1)),
[UpdatedBy] [nvarchar](360) NOT NULL
)
На заметку ...
- Таблицы кучи не допускаются, поэтому каждый столбец «Id» ОБЯЗАТЕЛЬНО должен быть
- Вы также должны привыкнуть к использованию GUID для ваших ПЕРВИЧНЫХ КЛЮЧЕЙ
ОПРЕДЕЛЕНИЕ ТАБЛИЦЫ ИСТОРИИ (используется для целей аудита):
Эта таблица используется для целей AUDIT. Вы по-прежнему узнаете, кто что сделал и когда, за исключением того, что история не спрятана в вашей главной таблице и не замедлит ваши ИНДЕКСЫ. И ... вы получаете НАСТОЯЩИЙ АУДИТ за пределы простой доставки журналов.
CREATE TABLE [history].[data_Categories](
[Id] [uniqueidentifier] NOT NULL DEFAULT (newid()),
[EntityId] [uniqueidentifier] NOT NULL,
[Name] [nvarchar](250) NOT NULL,
[Description] [nvarchar](500) NULL,
[ProductCount] [bigint] NULL,
[DisplayOrder] [bigint] NULL,
[IsActive] [bit] NOT NULL,
[UpdatedBy] [nvarchar](360) NOT NULL,
[UpdateType] [nvarchar](50) NOT NULL,
[UpdatedDate] [datetime] NOT NULL
)
GO
ALTER TABLE [history].[data_Categories] ADD CONSTRAINT [DF_data_Categories_31EC6D26] DEFAULT (newid()) FOR [Id]
GO
ALTER TABLE [history].[data_Categories] ADD CONSTRAINT [DF_data_Categories_32E0915F] DEFAULT (getutcdate()) FOR [UpdatedDate]
GO
ALTER TABLE [history].[data_Categories] ADD DEFAULT ('00000000-0000-0000-0000-000000000000') FOR [EntityId]
GO
На заметку ...
- Вы также можете отключить TRIGGERS в хранимых процедурах DELETE, чтобы сделать AUDIT «чище»
- Причина, по которой он становится "чище", заключается в том, что вы получаете одну запись DELETE AUDIT вместо записи UPDATE & DELETE AUDIT
- Для этого просто выключите ТРИГГЕР до УДАЛЕНИЯ ЗАЯВЛЕНИЯ и снова включите его.
TIGLE TRIGGER:
Просто нормальный триггер ...
CREATE TRIGGER [data].[trig_Categories]
ON [data].[Categories]
AFTER INSERT, DELETE, UPDATE
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
DECLARE @Id INT
DECLARE @Type VARCHAR(20);
IF EXISTS(SELECT * FROM INSERTED)
BEGIN
IF EXISTS(SELECT * FROM DELETED)
BEGIN
SET @Type ='UPDATED';
END
ELSE
BEGIN
SET @Type ='INSERTED';
END
INSERT INTO
history.data_Categories (
[EntityId]
,[Name]
,[Description]
,[DisplayOrder]
,[ProductCount]
,[IsActive]
,[UpdatedBy]
,[UpdateType])
SELECT
[Id]
,[Name]
,[Description]
,[DisplayOrder]
,[ProductCount]
,[IsActive]
,[UpdatedBy]
,@Type
FROM INSERTED
END
ELSE
BEGIN
SET @type = 'DELETED';
INSERT INTO
history.data_Categories (
[EntityId]
,[Name]
,[Description]
,[DisplayOrder]
,[ProductCount]
,[IsActive]
,[UpdatedBy]
,[UpdateType])
SELECT
[Id]
,[Name]
,[Description]
,[DisplayOrder]
,[ProductCount]
,[IsActive]
,[UpdatedBy]
,@Type
FROM DELETED
END;
END
GO