В предыдущей версии приложения мы использовали конкретное поле для первичного ключа, но поскольку это поле может представлять разные идентификаторы в разных системах, мы сделали его несущественным полем (т. е. не первичным ключом или частью составного первичного ключа), однако поскольку у нас нет другой системы, но пользователи по-прежнему используют это поле в качестве основного метода идентификации.
Проблема заключается в аудите... ранее я использовал одну таблицу для выполнения всех аудитов для базы данных, выгружающей данные со схемой newvalue oldvalue, используя общий триггер, который плавает вокруг. Это все еще может работать нормально, за исключением одной вещи. Я переместил контактную информацию в отдельную таблицу, привязанную к новому первичному ключу исходной таблицы. Поэтому, когда вносятся изменения, в журнале аудита отображается незнакомый и неиспользуемый первичный ключ вместо уже несущественного externalSystemID...
Я перешел к использованию метода аудита копирования «один к одному», чтобы любые изменения в любой таблице теперь записывались в зеркальное отображение в другой схеме. Проблема сводится к показу изменений пользователям. Они привыкли видеть отчет, в котором показаны только измененные значения для конкретного врача...
Мой вопрос будет заключаться в использовании запросов sql и отчетов Crystal, как я могу отображать только измененные значения столбцов между строками в моих таблицах аудита. Я посмотрел на команду поворота, но я не думаю, что это действительно поможет мне. Я также просмотрел код внутри сценария, который сравнивает столбцы и определяет, отличаются ли они, и записывает их в таблицу.
я действительно вращаюсь в песке здесь, и это критическая проблема для меня, чтобы решить. Заранее благодарю за любую помощь...
мы достаточно рано приступили к работе, поэтому я мог бы изменить свой метод отслеживания изменений, если потребуется, но это должно произойти в ближайшее время. Благодарность
РЕДАКТИРОВАТЬ:
Мой босс и я немного поработали над этим, и это то, с чего мы начали... Я хотел бы получить дополнительные мнения и варианты... также... спасибо...
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