Записи извлечения для журнала аудита

Я использую контрольный журнал в своем приложении. Я подписался на this и this создал таблицу истории, таблицы, которые нужно только проверять.

У меня есть следующие таблицы для хранения информации о пациенте.

TenantId представляют данные каждого арендатора, поскольку это многопользовательское приложение.

Person и Patient таблица

Человек

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

Пациент

Идентификатор, PatientIDentifier, IsOP, CanSendSMS, AddedBy, UpdatedBy, IsDeleted

Также еще одна таблица

Встреча

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

СТРУКТУРА ТАБЛИЦЫ АУДИТНОЙ ИСТОРИИ

PersonHistory

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

Здесь Action представляет A(ADD)/U(update)/D(delete)

Такая же структура создана для Patient, Appointment

Теперь у меня есть триггеры для вставки в таблицу истории всякий раз, когда происходит добавление / удаление / обновление.

Теперь у меня есть данные, доступные в таблице истории аудита.

Мне нужно написать запрос по двум требованиям.

  1. Получите все записи для пертикулярного пациента. Мне нужно получить все записи из PatientHostory, AppointmentHistory, PersonHistory, используя PatientId. Как написать SQL, который берет больше записей из той же таблицы для данного идентификатора? UNION or JOIN?

  2. Мне нужно взять все записи с all the HistoryTable for the supplied AuditUser Id.

Как мне написать для этого запрос?


person Billa    schedule 17.10.2013    source источник
comment
firstname, lastname и dob в этой таблице относятся к пользователю или пациенту? Можете ли вы также или альтернативно записать номер пациента?   -  person T I    schedule 17.10.2013
comment
@TI, firstname, lastname не является частью таблицы пациентов. Но когда создается пациент, мы добавляем запись в таблицу пациентов для базовой, а затем в таблицу пациентов.   -  person Billa    schedule 17.10.2013


Ответы (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

Возможно, было бы полезно создать указанное выше как встроенную функцию.

person T I    schedule 17.10.2013