Сравнение значений между двумя строками данных и отображение только разных столбцов
В предыдущей версии приложения мы использовали конкретное поле для первичного ключа, но поскольку поле может представлять разные идентификаторы в разных системах, мы сделали его несущественным полем (т.е. не первичным ключом или частью составного первичного ключа), однако, поскольку У нас нет другой системы, но пользователи все еще используют это поле в качестве основного метода идентификации.
Проблема заключается в аудите... ранее я использовал одну таблицу, чтобы выполнить все аудиты для базы данных, которая выгружает данные с помощью схемы с новым значением, используя общий триггер, который плавает вокруг. Это все еще может работать хорошо, за исключением одной вещи. Я перенес контактную информацию в отдельную таблицу, которая связана с новым первичным ключом исходной таблицы. Поэтому, когда вносятся изменения, незнакомый и неиспользованный первичный ключ отображается в журнале аудита вместо незначительного теперь ForeignSystemID...
Я перешел к выполнению метода аудита "один к одному", чтобы любые изменения в любой таблице теперь записывались в зеркальное отображение в другой схеме. Проблема сводится к тому, чтобы показать изменения пользователям. Они привыкли видеть отчет, который показывает только измененные значения для конкретного врача...
Мой вопрос заключается в том, чтобы использовать SQL-запросы и отчеты Crystal, как я могу показать только измененные значения столбцов между строками в моих таблицах аудита. Я посмотрел на команду pivot, но я не думаю, что это действительно поможет мне. Я также рассмотрел код в скрипте, который сравнивает столбцы и определяет, отличаются ли они, и записывает их в таблицу.
Я действительно вращаюсь в песке здесь, и это критическая проблема для меня, чтобы решить. Заранее благодарю за любую помощь...
мы достаточно рано начали производство, чтобы я мог изменить свой метод отслеживания изменений, если это будет необходимо, но это должно произойти в ближайшее время. Спасибо
РЕДАКТИРОВАТЬ:
Мой босс и я немного поработали над этим, и с этого мы и начали... Я хотел бы получить дальнейшие мнения и варианты... а также... спасибо...
CREATE TABLE #TEMP (
DoctorsID bigint,
TableName varchar(50),
FieldName varchar(50),
CurrentFieldValue varchar(255),
PreviousFieldValue varchar(255),
PreviousValueDate datetime
)
DECLARE @sql varchar(MAX)
SELECT
@sql = COALESCE(@sql,'') +
CAST(
'INSERT INTO #TEMP ' +
'SELECT ' +
'o.DoctorsID, ' +
'''' + TABLE_NAME + ''' ,' +
'''' + COLUMN_NAME + ''',' +
'o.' + COLUMN_NAME + ',' +
'a.' + COLUMN_NAME + ',' +
'a.AuditDate' +
' FROM ' +
'dbo.DoctorLicenses o ' +
'INNER JOIN Audit.DoctorLicenses a ON ' +
'o.DoctorsID = a.DoctorsID ' +
'WHERE ' +
'AuditDate BETWEEN ''10/01/2010'' AND ''10/31/2010'' AND ' +
'o.' + COLUMN_NAME + ' <> a.' + COLUMN_NAME +
';'
AS varchar(MAX))
FROM
INFORMATION_SCHEMA.COLUMNS AS [Fields]
WHERE
TABLE_SCHEMA = 'dbo' AND
TABLE_NAME = 'DoctorLicenses'
PRINT @sql
EXEC(@sql)
SELECT * FROM #TEMP
DROP TABLE #TEMP
1 ответ
Для меня это звучит так, как будто есть проблема с дизайном, но мне трудно представить, каков ваш дизайн на данный момент. Можете ли вы более точно определить, как выглядят ваши таблицы в настоящее время и на каких данных вы пытаетесь сгенерировать отчет (ы)?
Кроме того, когда вы говорите об аудите "измененных значений", как вы отслеживаете то, что было изменено?