【问题标题】:Pull records for Audit Trail为审计跟踪提取记录
【发布时间】:2013-10-25 22:00:15
【问题描述】:

我正在我的应用程序中实施审计跟踪。我跟着thisthis 创建了只需要审计的表。

我有一个下表来存储患者信息。

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

PersonPatient

人物

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

患者

Id、PatientIDentifier、IsOP、CanSendSMS、AddedBy、UpdatedBy、IsDeleted

还有一张桌子

约会

Id、PatientId、AppointmentDate、DoctorId、价格、AddedBy、UpdateBy

审计历史表结构

人物历史

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 中提取所有记录。我们如何编写 SQL 来从给定 id 的同一张表中获取更多记录? UNION or JOIN?

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

我该如何为此编写查询?

【问题讨论】:

  • 此表中的firstnamelastnamedob 是指用户还是患者?您是否也可以记录患者编号?
  • @TI, firstname, lastname 不是患者表的一部分。但是当一个病人被创建时,我们在 person 表中为 basic 添加一条记录,然后在病人表中添加一个记录

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


【解决方案1】:

您可以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

如果您需要从“原始”数据(即PatientIds)中获取信息,那么再次使用该视图,您可以按照以下方式进行操作

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

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

【讨论】:

    猜你喜欢
    • 2012-06-18
    • 2011-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-31
    • 2015-10-23
    • 1970-01-01
    • 2023-03-04
    相关资源
    最近更新 更多