Запрос, чтобы получить все версии графа объекта - PullRequest
0 голосов
/ 21 октября 2008

Я внедряю журнал аудита в базе данных, поэтому у всех есть столбцы CreatedAt и RemovedAt. Теперь я хочу иметь возможность перечислить все ревизии графа объектов, но лучший способ, которым я могу придумать для этого, состоит в том, чтобы использовать объединения. Мне нужно получить каждый уникальный идентификатор CreatedAt и RemovedAt. * ​​1001 *

Если я получу список стран с провинциями, профсоюз будет выглядеть так:

SELECT c.CreatedAt AS RevisionId from Countries as c where localId=@Country
UNION
SELECT p.CreatedAt AS RevisionId from Provinces as p 
INNER JOIN Countries as c ON p.CountryId=c.LocalId AND c.LocalId = @Country
UNION
SELECT c.RemovedAt AS RevisionId from Countries as c where localId=@Country
UNION
SELECT p.RemovedAt AS RevisionId from Provinces as p 
INNER JOIN Countries as c ON p.CountryId=c.LocalId AND c.LocalId = @Country

Для более сложных запросов это может быть довольно сложно и, возможно, работать очень плохо, поэтому я хотел посмотреть, сможет ли кто-нибудь придумать лучший подход. Это в MSSQL Server.

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

Ответы [ 3 ]

1 голос
/ 11 ноября 2008

Скорее всего, вы уже внедрили свое решение, но для решения нескольких проблем; Я бы предложил рассмотреть решение Aleris или его производную.

В ваших таблицах у вас есть поле «удалено в» - хорошо, если это поле было активным (заполненным), технически данные не должны быть там - или, возможно, ваша реализация пометила их для удаления , который прервет запись, как только будет удалено.
Что происходит, когда у вас есть несколько обновлений в течение отчетного периода - предыдущие записи журнала будут перезаписаны.
Наличие отдельного журнала позволяет архивировать информацию журнала и позволяет устанавливать цикл анализа журнала, отличный от циклов обновления / редактирования.
Добавьте все поля «связывания», необходимые для того, чтобы вы могли вернуться к исходным данным ИЛИ сделайте описания достаточно многословными.

Поля, содержащиеся в вашем журнале, принадлежат вам, но решение Aleris является прямым. Я могу создать таблицу действий и изменить тип поля с varchar на int, как ссылку на таблицу действий, что вынуждает разработчиков выполнять некоторые стандартизированные действия.

Надеюсь, это поможет.

1 голос
/ 21 октября 2008

Альтернативой может быть создание журнала аудита, который может выглядеть следующим образом:

AuditLog table
    EntityName varchar(2000),
    Action varchar(255),
    EntityId int,
    OccuranceDate datetime

где EntityName - это имя таблицы (например, Contries, Provinces), Action - действие аудита (например, Created, Removed и т. Д.), А EntityId - первичный ключ измененной строки в исходной таблице.

Таблица должна быть синхронизирована при каждом действии с таблицами. Есть несколько способов сделать это:

1) Создайте триггеры для каждой таблицы, которые добавят строки в AuditTable
2) Из вашего приложения добавляйте строки в AuditTable каждый раз, когда вносятся изменения в rerespontables

Используя это решение, очень просто получить список журналов аудита.

Если вам нужно получить столбцы из исходной таблицы, также возможно использование таких объединений:

select *
from 
    Contries C 
    join AuditLog L on C.Id = L.EntityId and EntityName = 'Contries'
0 голосов
/ 21 октября 2008

Возможно, вы могли бы сделать это с помощью перекрестного соединения и объединения, но объединение, вероятно, все еще лучше с точки зрения производительности. Вы можете попробовать проверить каждый из них.

SELECT
     COALESCE(C.CreatedAt, P.CreatedAt)
FROM
     dbo.Countries C
FULL OUTER JOIN dbo.Provinces P ON
     1 = 0
WHERE
     C.LocalID = @Country OR
     P.LocalID = @Country
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...