В предыдущей версии приложения мы использовали конкретное поле для первичного ключа, но поскольку поле может представлять разные идентификаторы в разных системах, мы сделали его несущественным полем (т. Е. Не первичным ключом или частью составного первичного ключа).) однако, поскольку у нас нет другой системы, но пользователи все еще используют это поле в качестве основного метода идентификации.
Проблема заключается в аудите ... ранее я использовал одну таблицу для всех аудитов базы данных, дампующихданные со схемой oldvalue с новым значением, используя общий триггер, который плавает вокруг.Это все еще может работать хорошо, за исключением одной вещи.Я перенес контактную информацию в отдельную таблицу, которая связана с новым первичным ключом исходной таблицы.Поэтому, когда вносятся изменения, в журнале аудита отображается незнакомый и неиспользуемый первичный ключ вместо незначительного теперь 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