我正在尝试制作一个记录系统中几乎所有内容的审计表。我打算使用触发器,但我想记录搜索等内容,并且我总是想记录 Action-er(执行该操作的用户)。
因此,因为我的应用程序中有许多不同的对象需要记录(配置文件、公司、页面等),所以我需要创建一个表来保存所有不同对象的所有信息。
我正在使用 MSSQL,但也许我应该查看文档数据库,但我不确定使用 SQL 数据库存储数据和使用文档数据库进行审计是否是一个好主意....也许有人有这方面的经验?
无论如何,我的桌子看起来像这样:
CREATE TABLE [dbo].[cg_AuditTrail](
[Id] [int] IDENTITY(1,1) NOT NULL,
[CompanyId] [uniqueidentifier] NOT NULL,
[UserId] [uniqueidentifier] NOT NULL,
[UserName] [nvarchar](255) NOT NULL,
[ObjectName] [nvarchar](100) NOT NULL,
[EventId] [int] NOT NULL,
[Data] [xml] NOT NULL,
[Date] [datetime] NOT NULL,
CONSTRAINT [PK_cg_AuditTrail] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[cg_AuditTrail] WITH CHECK ADD CONSTRAINT [FK_cg_AuditTrail_cg_AuditEventTypes] FOREIGN KEY([EventId])
REFERENCES [dbo].[cg_AuditEventTypes] ([Id])
GO
ALTER TABLE [dbo].[cg_AuditTrail] CHECK CONSTRAINT [FK_cg_AuditTrail_cg_AuditEventTypes]
GO
如您所见,我将对象作为 XML 存储在数据库中。我在我的项目中创建了一个工厂类,以将我的任何对象转换为可序列化的对象。在大多数情况下,这不是必需的,但对于某些对象来说是必需的。这是我的工厂对象之一:
public static Objects.Page PageFactory(Page Object)
{
Objects.Page FactoryObject = new Objects.Page()
{
Id = Object.Id,
ParentId = Object.ParentId,
UserId = Object.UserId,
CompanyId = Object.CompanyId,
Author = Object.Author,
DateCreated = Object.DateCreated,
DateModified = Object.DateModified,
ModifiedById = Object.ModifiedById,
ModifiedBy = Object.ModifiedBy,
Name = Object.Name,
Description = Object.Description,
Path = Object.Path,
FileName = Object.FileName,
Link = Object.Link,
ViewTitle = Object.ViewTitle,
Restricted = Object.Restricted,
Published = Object.Published,
TypeId = Object.TypeId,
Type = Object.Type.ToString(),
Order = Object.Order,
};
return FactoryObject;
}
所以我的问题如下:
- 这是创建审计的好方法吗?
- 如果我想从 XML 列中获取一些数据,在 SQL 中可以吗?
- 使用文档数据库而不是 MSSQL 会更好吗?
任何帮助表示赞赏,/r3plica