Сравнение значений между двумя строками данных и отображение только разных столбцов - PullRequest
1 голос
/ 28 октября 2010

В предыдущей версии приложения мы использовали конкретное поле для первичного ключа, но поскольку поле может представлять разные идентификаторы в разных системах, мы сделали его несущественным полем (т. Е. Не первичным ключом или частью составного первичного ключа).) однако, поскольку у нас нет другой системы, но пользователи все еще используют это поле в качестве основного метода идентификации.

Проблема заключается в аудите ... ранее я использовал одну таблицу для всех аудитов базы данных, дампующихданные со схемой 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

1 Ответ

0 голосов
/ 28 октября 2010

Мне кажется, что есть проблема с дизайном, но мне трудно представить, каков ваш дизайн на данный момент. Можете ли вы более точно указать, как выглядят ваши таблицы в настоящее время и на каких данных вы пытаетесь сгенерировать отчет (ы)?

Кроме того, когда вы говорите об аудите «измененных значений», как вы отслеживаете то, что было изменено?

...