拉出Audit Trail的记录

时间:2013-10-17 12:05:34

标签: sql sql-server sql-server-2008 audit-logging

我正在我的应用程序中实现审计跟踪。我按照thisthis创建了历史记录表,只需要审核这些表。

我有以下表格来存储患者信息。

TenantId 代表每个租户数据,因为它是多租户应用

PersonPatient

Id,TenantId,FirstName,LastName,DOB,Mobile,Email,AddedBy,UpdatedBy,IsDeleted

病人

Id,PatientIDentifier,IsOP,CanSendSMS,AddedBy,UpdatedBy,IsDeleted

另一张表

预约

Id,PatientId,AppointmentDate,DoctorId,Price,AddedBy,UpdatedBy

审计历史表结构

PersonH​​istory

AuditId,Id,FirstName,LastName,DOB,AddedBy,UpdatedBy,AuditUserId,AuditDate,Action

此处Action代表A(ADD)/U(update)/D(delete)

Patient, Appointment

创建了相同的结构

现在,每当添加/删除/更新发生时,我都会在历史记录表中插入触发器。

现在,我在审计历史记录表中获得了数据。

我必须为两个要求写一个查询。

  1. 获取特定患者的所有记录。我需要使用PatientId从PatientHostory,AppointmentHistory,PersonH​​istory中提取所有记录。对于给定的id,我们如何编写从同一个表中获取更多记录的SQL? UNION or JOIN

  2. 我需要从all the HistoryTable for the supplied AuditUser Id获取所有记录。

  3. 我如何为此编写查询?

1 个答案:

答案 0 :(得分:2)

您会UNION日志数据,还会考虑添加HistoryType列来指示它所引用的表

SELECT AuditId, Id, FirstName, LastName, DOB, AddedBy, UpdatedBy, 
       AuditUserId, AuditDate, Action, 'Person' HistoryType
FROM PersonHistory ph
JOIN Person p ON ph.id = p.id 
UNION ALL
SELECT AuditId,Id, FirstName, LastName, DOB, AddedBy, UpdatedBy, 
       AuditUserId, AuditDate, Action, 'Patient' HistoryType
FROM PatientHistory
UNION ALL    
SELECT AuditId,Id, FirstName, LastName, DOB, AddedBy, UpdatedBy, 
       AuditUserId, AuditDate, Action, 'Appointment' HistoryType
FROM AppointmentHistory

将上述内容转换为VIEW可以让您更轻松地进一步查询数据

SELECT * FROM vAuditHistory
WHERE AuditUserId = 1234

如果您需要从“原始”数据中获取信息,即PatientId,然后再次使用该视图,您可以执行以下操作

DECLARE @PatientId VARCHAR(10) = '12345ABCDE'

SELECT h.*, p.PatientId
FROM vAuditHistory h
JOIN Patient pt ON pt.id = h.id
WHERE h.HistoryType = 'Patient'
AND pt.PatientId = @PatientId
UNION ALL
SELECT h.*, a.PatientId
FROM vAuditHistory h
JOIN Appointment a t ON a.id = h.id
WHERE h.HistoryType = 'Appointment'
AND pt.PatientId = @PatientId

或没有视图

SELECT h.*, p.PatientId
FROM PatientHistory h
JOIN Patient pt ON pt.id = h.id
WHERE pt.PatientId = @PatientId
UNION ALL
SELECT h.*, a.PatientId
FROM AppointmentHistory h
JOIN Appointment a t ON a.id = h.id
WHERE pt.PatientId = @PatientId

将上述内容创建为内联函数可能很有用