审计 SQL Server - 谁在啥时候改变啥? SOX 合规性

Posted

技术标签:

【中文标题】审计 SQL Server - 谁在啥时候改变啥? SOX 合规性【英文标题】:Auditing SQL Server - who is changing what and when? SOX complaince审计 SQL Server - 谁在什么时候改变什么? SOX 合规性 【发布时间】:2021-06-08 18:48:39 【问题描述】:

在我的组织中,我们正在做非常有限的日志记录或任​​何类型的记录来捕捉谁在何时更改什么。

我在这里寻求帮助,以了解捕获 SQL Server 数据库中发生的任何日志记录的最佳实践。

我正在考虑根据用户可以使用应用程序执行的重要业务用例查看表格,然后制作一个包含以下字段的 xl 文件,以便我将此文件作为自己的参考。

我的问题:还有其他更好的方法来捕获数据库中的当前更改吗?SQL Server 中是否有一种方法可以用来确定我们是否正在捕获数据库中的任何日志记录?

我们没有启用任何 CDC 实施或 C2 审计跟踪或更改跟踪。

管理层希望利用数据库表中捕获的数据。

【问题讨论】:

您不能真正在同一个系统中进行正确的日志记录,它必须是另一个系统接收并存储该数据。否则任何人都可以更改审计表。 你是对的,但是,目标是至少开始填补任何日志记录的技术债务。如果我可以提交一份报告,将审计率从 0% 提高到 20%,同时只捕获关键业务用例周围的数据,那么我就走上了成功之路。因此,这方面的任何帮助都会很有用。 【参考方案1】:

我正在做一个类似的项目,您可以使用下面的设计,我正在用学生主题示例进行解释

CREATE TABLE [dbo].[AudRel](
    [AudId] [int] IDENTITY(1,1) NOT NULL,
    [AudTableName] [varchar](100) NULL,
    [AudFieldName] [varchar](100) NULL,
    [AudFieldID] [varchar](30) NULL,
 CONSTRAINT [PK_AuditRel] PRIMARY KEY CLUSTERED 
(
    [AudId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

CREATE TABLE [dbo].[Student](
    [StudentID] [int] IDENTITY(1,1) NOT NULL,
    [StudentName] [varchar](100) NULL,
 CONSTRAINT [PK_Student] PRIMARY KEY CLUSTERED 
(
    [StudentID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]


CREATE TABLE [dbo].[Student_Audit](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [StudentID] [int] NOT NULL,
    [StudentName] [varchar](100) NULL
) ON [PRIMARY]

CREATE TABLE [dbo].[StudentSubject](
    [SSID] [int] IDENTITY(1,1) NOT NULL,
    [StudentID] [int] NULL,
    [SubjectID] [int] NULL,
 CONSTRAINT [PK_StudentSubject] PRIMARY KEY CLUSTERED 
(
    [SSID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

CREATE TABLE [dbo].[StudentSubject_Audit](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [SSID] [int] NOT NULL,
    [StudentID] [int] NULL,
    [SubjectID] [int] NULL
) ON [PRIMARY]

CREATE TABLE [dbo].[Subject](
    [SubjectID] [int] IDENTITY(1,1) NOT NULL,
    [SubjectName] [varchar](50) NULL,
 CONSTRAINT [PK_Subject] PRIMARY KEY CLUSTERED 
(
    [SubjectID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

CREATE TABLE [dbo].[Subject_Audit](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [SubjectID] [int] NOT NULL,
    [SubjectName] [varchar](50) NULL
) ON [PRIMARY]


SET IDENTITY_INSERT [dbo].[AudRel] ON 
INSERT [dbo].[AudRel] ([AudId], [AudTableName], [AudFieldName], [AudFieldID]) VALUES (1, N'Student', N'StudentName', N'StudentID')
INSERT [dbo].[AudRel] ([AudId], [AudTableName], [AudFieldName], [AudFieldID]) VALUES (2, N'Subject', N'SubjectName', N'SubjectID')


SET IDENTITY_INSERT [dbo].[AudRel] OFF

SET IDENTITY_INSERT [dbo].[Student] ON 
INSERT [dbo].[Student] ([StudentID], [StudentName]) VALUES (1, N'Alex')
INSERT [dbo].[Student] ([StudentID], [StudentName]) VALUES (2, N'DSouza')
SET IDENTITY_INSERT [dbo].[Student] OFF

SET IDENTITY_INSERT [dbo].[StudentSubject] ON 
INSERT [dbo].[StudentSubject] ([SSID], [StudentID], [SubjectID]) VALUES (1, 1, 1)
INSERT [dbo].[StudentSubject] ([SSID], [StudentID], [SubjectID]) VALUES (2, 2, 1)
INSERT [dbo].[StudentSubject] ([SSID], [StudentID], [SubjectID]) VALUES (3, 2, 2)
SET IDENTITY_INSERT [dbo].[StudentSubject] OFF

SET IDENTITY_INSERT [dbo].[Subject] ON 
INSERT [dbo].[Subject] ([SubjectID], [SubjectName]) VALUES (1, N'English')
INSERT [dbo].[Subject] ([SubjectID], [SubjectName]) VALUES (2, N'Mathematics')
SET IDENTITY_INSERT [dbo].[Subject] OFF

然后使用下面的查询来动态获取已更改的字段。您需要从 UI 传递 AudRelID

DECLARE @TableName VARCHAR(100),@FieldName VARCHAR(100),@FieldID VARCHAR(100)

SELECT @TableName = [AudTableName]
, @FieldName=[AudFieldName]
, @FieldID=[AudFieldID] 
FROM [dbo].[AudRel] WHERE [AudId] = 1 -- (Ex : StudentHistory)


DECLARE @SQL NVARCHAR(MAX) = N'
 SELECT ID,'  + @FieldID +
','  + @FieldName + ' FROM ' +  @TableName + '_Audit ' + ' WHERE ' + @FieldID + ' = ' 
+ Convert(varchar(20),@FieldID) 

print @SQL
EXECUTE sp_executesql @SQL

【讨论】:

感谢您与我分享详细信息和 SQL 代码,但是,我的问题是在文档方面,即使用最佳实践来查找当前数据库中 DML 审计中的差距。我确信您的代码可以帮助我围绕关键业务表实施审计。

以上是关于审计 SQL Server - 谁在啥时候改变啥? SOX 合规性的主要内容,如果未能解决你的问题,请参考以下文章

c#sqlserver在啥情况下使用到groupby进行分组查询

SQLserver数据库中,在啥情况下删除数据不能成功?

jquery 分页插件pagination的回调函数callback在啥时候执行?有啥用?

英语:在啥情况下单词后面加s,在啥情况下加es

SERVER REFLEXIVE 和 PEER REFLEXIVE 地址/候选人在啥情况下彼此不同?

函数对象在啥时候具有属性?