只是提供另一個例子,這裏是我使用...
表定義:
這只是一個普通表,除了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對您的PRIMARY KEY的
歷史表定義(用於審計目的):
此表用於AUDI T的目的。你仍然可以看到誰在什麼時間做什麼,除了現在,歷史沒有被埋在你的主表中,也不會減慢你的INDEXES。而且......你獲得真正的審計超越了單純的日誌傳送。
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
在一個側面說明...
- 您也可以關閉在刪除存儲過程的觸發器使審計「清潔」
- 變得「乾淨」的原因你得到一個DELETE AUDIT記錄而不是UPDATE & DELETE AUDIT記錄
- 要做到這一點,只需在DELETE STATEMENT之前關閉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
你是怎樣嘗試插入數據?如果您一次插入多行,則該觸發器將失敗。 – Gixonita
觸發器失敗的方式是什麼?請在你的文章中詳細說明。 –
錯誤meesage將有助於理解問題 –