SQL Server 数据审计机制的实现

在现代数据库应用中,审计跟踪是维护数据完整性和安全性的关键部分。无论是为了满足合规性要求,还是为了监控和分析用户行为,审计跟踪都扮演着至关重要的角色。本文将探讨在MicrosoftSQL Server中实现数据审计跟踪的不同机制,包括使用触发器和系统版本化表的方法。

审计跟踪的重要性

审计跟踪对于应用程序和数据来说都是至关重要的。它可以帮助跟踪数据的变化,以保持审计线索。以下是实施审计机制的一些原因:

  • 审计跟踪可以帮助应用程序维护谁做了哪些更改的记录。
  • 审计跟踪可以帮助在发生意外更改或应用程序错误的情况下,恢复到任何给定时间点的状态。
  • 审计跟踪可以帮助发现用户涉及的模式,从而有助于增强应用程序或未来的开发机会。

SQL Server中的审计跟踪实现

在本文中,将了解和实现在Microsoft SQL Server级别上对应用程序数据实施审计跟踪的不同机制。将讨论如何为DML对象实现审计机制。

让深入了解在SQL Server中实现数据审计跟踪的不同解决方案。下面提到的解决方案是在Microsoft SQL Server 2016数据库中实现的。

在解决方案1中,将讨论大多数组织仍在使用的传统方法,或者可能是旧的遗留应用程序实现的机制。

为了跟踪SQL数据库表中的数据变化,可以使用触发器来跟踪之前和新的更改。

首先,让使用SSMS在SQL Server中创建以下表。

CREATE TABLE [dbo].[Employee]( [Employee_Id] INT NOT NULL, [Employee_Name] NVARCHAR(100) NOT NULL, [Employee_Designation] NVARCHAR(50) NOT NULL, [Employee_Salary] FLOAT NOT NULL )

接下来,让向Employee表中添加一些记录。

INSERT INTO [dbo].[Employee] ([Employee_Id], [Employee_Name], [Employee_Designation], [Employee_Salary]) VALUES (1, 'David Schofield', 'Technical Manager', 4000000) INSERT INTO [dbo].[Employee] ([Employee_Id], [Employee_Name], [Employee_Designation], [Employee_Salary]) VALUES (2, 'John Smith', 'Director', 10000000) INSERT INTO [dbo].[Employee] ([Employee_Id], [Employee_Name], [Employee_Designation], [Employee_Salary]) VALUES (3, 'Anna Boston', 'Engineer', 200000)

为了跟踪表的更改,将实现以下触发器,以帮助跟踪之前或新的值,无论何时在Employee表上执行Insert、Delete操作。

为了保持审计记录或历史记录,将创建一个名为“AuditLog”的新表,该表将在触发器在任何update或delete操作发生时被填充。

CREATE TABLE [dbo].[AuditLog]( [AuditLog_Id] INT NOT NULL IDENTITY(1,1) PRIMARY KEY, [Action] NVARCHAR(50) NOT NULL, [PreviousRecord] XML NULL, [NewRecord] XML NULL, [ModifiedOn] DATETIME NOT NULL )

现在,让在Employee表上编写一个触发器

ALTER TRIGGER [dbo].[trg_AuditTable] ON [dbo].[Employee] AFTER DELETE, UPDATE AS BEGIN SET NOCOUNT ON; DECLARE @PreviousRecord AS XML DECLARE @NewRecord AS XML DECLARE @Action VARCHAR(10) IF EXISTS (SELECT * FROM deleted) SELECT @Action = 'DELETE' IF EXISTS (SELECT * FROM inserted) IF EXISTS (SELECT * FROM deleted) SELECT @Action = 'UPDATE' SET @PreviousRecord = ( SELECT * FROM Deleted FOR XML PATH('Employee'), TYPE, ROOT('Record')) SET @NewRecord = ( SELECT * FROM Inserted FOR XML PATH('Employee'), TYPE, ROOT('Record')) INSERT INTO [dbo].[AuditLog] ( [Action], [PreviousRecord], [NewRecord], [ModifiedOn] ) VALUES ( @Action, @PreviousRecord, @NewRecord, GETDATE() ) END

现在,已经为Employee表设置了审计机制。让尝试在Employee表上执行一些UPDATE和DELETE操作,并查看它如何记录在AuditLog表中。

UPDATE [dbo].[Employee] SET [Employee_Designation] = 'Engineering Manager', [Employee_Salary] = '50000' WHERE [Employee_Id] = 3

执行上述UPDATE命令,并检查AuditLog表以找出维护的审计或历史记录。

微软表示 - 系统版本化表(也称为系统版本化表)是数据库功能,它提供了内置支持,用于提供表中存储的数据在任何时间点的信息,而不仅仅是当前时刻正确的数据。

会说系统版本化表是实现触发器的现代版本。让看看如何实现。

这次,将创建一个名为STUDENT的新表。

CREATE TABLE [dbo].[Student]( [Student_Id] INT NOT NULL PRIMARY KEY IDENTITY(1,1), [Student_Name] NVARCHAR(100) NOT NULL, [Student_Address] NVARCHAR(50) NOT NULL, [Student_City] NVARCHAR(50) NOT NULL, [ValidFrom] DATETIME2 GENERATED ALWAYS AS ROW START, [ValidTo] DATETIME2 GENERATED ALWAYS AS ROW END, PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo) ) WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.StudentAuditLog))

现在让向Student表中添加一些记录。

INSERT INTO [dbo].[Student] ([Student_Name], [Student_Address], [Student_City]) VALUES ('John Smith', '45 Street Avenue', 'New York') INSERT INTO [dbo].[Student] ([Student_Name], [Student_Address], [Student_City]) VALUES ('Anna Boston', '511 Avenue', 'New York')

现在让尝试更新一些记录,看看系统版本化表是如何进行审计的。执行以下查询以更新Student表中的值。

UPDATE [dbo].[Student] SET [Student_Address] = 'Madison Road', [Student_City] = 'Washington DC' WHERE [Student_Id] = 1
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485