2010-10-28 2 views
1

Dans une version d'application précédente, nous utilisions un champ particulier pour une clé primaire, mais comme le champ pouvait représenter différentes identités sur différents systèmes, nous en avons fait un champ non significatif (c'est-à-dire pas une clé primaire ou une partie d'un primaire composite) mais comme nous n'avons pas d'autre système, les utilisateurs utilisent toujours ce champ comme méthode d'identification principale. Le problème est avec l'audit ... auparavant, j'utilisais une seule table pour effectuer toutes les vérifications de la base de données en vidant les données avec un nouveau schéma oldvalue en utilisant le déclencheur générique qui circule. Cela pourrait encore fonctionner correctement, sauf pour une chose. J'ai déplacé l'information de contact dans une table distincte qui est liée à la nouvelle clé primaire de la table d'origine. Ainsi, lorsque des modifications sont effectuées, la clé primaire inconnue et inutilisée s'affiche dans le journal d'audit au lieu du foreignSystemID désormais insignifiant ...Comparer des valeurs entre deux lignes de données et afficher uniquement les colonnes qui sont différentes

J'ai migré vers une méthode d'audit de copie un à un afin que toutes les modifications apportées à une table soient maintenant écrites à une image miroir dans un schéma différent. Le problème revient à montrer les changements aux utilisateurs. Ils sont utilisés pour voir un rapport qui montre seulement les valeurs changées pour un docteur particulier ...

Ma question utiliserait des requêtes SQL et des rapports Crystal, comment pourrais-je montrer seulement les valeurs de colonnes changées entre les lignes dans mes tables d'audit? . J'ai regardé la commande de pivot, mais je ne pense pas que cela va vraiment m'aider. J'ai également regardé le code dans le script qui compare les colonnes et détermine si elles sont différentes et les écrit à la table.

Im vraiment tourner dans le sable ici et c'est un problème critique pour moi de résoudre. Merci d'avance pour toute aide ...

Nous sommes assez tôt dans la production que je pourrais changer ma méthode changetracking si besoin est, mais il doit être bientôt. grâce

EDIT:

Mon patron et moi avons travaillé sur ce un peu et c'est ce que nous avons commencé avec ... Je voudrais obtenir d'autres opinions et options ... et ... merci ..

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 

Répondre

0

Il me semble comme il y a un problème de conception, mais j'ai du mal à envisager ce que votre conception est à l'heure actuelle. Pouvez-vous être plus précis sur ce à quoi ressemblent vos tableaux en ce moment et sur quelles données vous tentez de générer le (s) rapport (s)?

De même, lorsque vous parlez d'auditer les "valeurs modifiées", comment gérez-vous les modifications?

+0

désolé vous avez raison, mes questions initiales semblent toujours être ambiguës. Chaque table a une table correspondante dans un schéma distinct. dbo.contactinfo a audit.contactinfo. toutes les colonnes sont les mêmes sauf que l'audit a 2 extra (type, auditdate). Lorsqu'un dataitem est modifié, une nouvelle ligne est insérée dans la table d'audit avec les données en cours. Ainsi vous avez ce que les données étaient dans la rangée précédente (quand elles sont triées par auditdate) et quelle est la date actuelle en tant que première rangée. Ainsi, si vous interrogez la table d'audit normalement, vous obtenez une comptabilité complète de toutes les modifications apportées à cette table. – ecathell

+0

Cependant, nos utilisateurs veulent voir une valeur actuelle/ancienne représentation de la valeur dans les colonnes. Moi et mon patron avons vraiment pu travailler à travers ce joli ... voir mes modifications ... merci – ecathell

+0

Très bien, j'ai une meilleure idée de l'endroit où vous essayez d'aller. À quoi ressemble le résultat final? – Remus

Questions connexes