我想在主表“Table1”中进行插入,更新或删除时将行插入到审计表中 - 无论哪个列被更改/插入都无关紧要。我还想在插入,更新或删除时添加I,U或D.对于插入和删除,我正在检查inserted和deleted表中是否存在行。什么是接近更新的最佳方式。
我的插入和删除代码是:
CREATE TRIGGER [dbo].[tr_Table1_InsertUpdate_Table1History_Insert]
ON [dbo].[Table1]
FOR INSERT, DELETE, UPDATE
AS
BEGIN
IF EXISTS(SELECT * FROM Inserted)
BEGIN
INSERT INTO Table1History(...., ModificationType)
SELECT ..., 'I'
FROM Inserted
END
IF EXISTS(SELECT * FROM Deleted)
BEGIN
INSERT INTO Table1History(..., ModificationType)
SELECT ..., 'D'
FROM Deleted
END
END
GO
请帮忙!
答案 0 :(得分:5)
对于更新,行的原始值将添加到已删除的表中,并且该行的新值将添加到插入的表中。因此,要识别插入,删除和更新,您可以执行以下操作
答案 1 :(得分:5)
这不是一个便宜的工具,但你可以在试用模式下使用它来完成工作。
注意INSERT INTO dbo.AUDIT_LOG_DATA部分,并为要审核的每个列重复该部分。
后台有两个表用于存储数据和几个存储过程,但这样可以让你朝着正确的方向前进。
CREATE TRIGGER [dbo].[tr_d_AUDIT_TableName]
ON [dbo].[TableName]
FOR DELETE
NOT FOR REPLICATION
AS
BEGIN
DECLARE
@IDENTITY_SAVE varchar(50),
@AUDIT_LOG_TRANSACTION_ID Int,
@PRIM_KEY nvarchar(4000),
--@TABLE_NAME nvarchar(4000),
@ROWS_COUNT int
SET NOCOUNT ON
Select @ROWS_COUNT=count(*) from deleted
Set @IDENTITY_SAVE = CAST(IsNull(@@IDENTITY,1) AS varchar(50))
INSERT
INTO dbo.AUDIT_LOG_TRANSACTIONS
(
TABLE_NAME,
TABLE_SCHEMA,
AUDIT_ACTION_ID,
HOST_NAME,
APP_NAME,
MODIFIED_BY,
MODIFIED_DATE,
AFFECTED_ROWS,
[DATABASE]
)
values(
'TableName',
'dbo',
3, -- ACTION ID For DELETE
CASE
WHEN LEN(HOST_NAME()) < 1 THEN ' '
ELSE HOST_NAME()
END,
CASE
WHEN LEN(APP_NAME()) < 1 THEN ' '
ELSE APP_NAME()
END,
SUSER_SNAME(),
GETDATE(),
@ROWS_COUNT,
'DatabaseName'
)
Set @AUDIT_LOG_TRANSACTION_ID = SCOPE_IDENTITY()
INSERT
INTO dbo.AUDIT_LOG_DATA
(
AUDIT_LOG_TRANSACTION_ID,
PRIMARY_KEY_DATA,
COL_NAME,
OLD_VALUE_LONG,
DATA_TYPE
, KEY1
)
SELECT
@AUDIT_LOG_TRANSACTION_ID,
convert(nvarchar(1500), IsNull('[Order_ID]='+CONVERT(nvarchar(4000), OLD.[Order_ID], 0), '[Order_ID] Is Null')),
'Order_ID',
CONVERT(nvarchar(4000), OLD.[Order_ID], 0),
'A'
, CONVERT(nvarchar(500), CONVERT(nvarchar(4000), OLD.[Order_ID], 0))
FROM deleted OLD
WHERE
OLD.[Order_ID] Is Not Null
END
答案 2 :(得分:4)
您是否考虑过使用AutoAudit?
AutoAudit是一个SQL Server(2005年,2008年) 创建审计的Code-Gen实用程序 跟踪触发器:
- Created,CreatedBy,Modified,ModifiedBy和RowVersion (递增INT)列到表
- 将事件记录到审核表
- 更新记录到审核表的新旧值
- 删除将所有最终值记录到Audit tbale
- 查看重建已删除的行
- UDF重建行历史
- 用于跟踪架构更改的架构审核触发器
- 当Alter Table更改表格时重新编码gens触发