2013-07-19 3 views
0

J'ai 2 tables individuelles (IndividualId est la clé primaire) et IndividualAudit. Chaque fois que la mise à jour est effectuée sur la table individuelle l'enregistrement va à la table d'audit. Il y a beaucoup de colonnes qui peuvent être modifiées, mais je ne m'intéresse qu'à ramasser des enregistrements où le SSN est modifié. Je suis à l'aide ci-dessous requête:Aide à la requête pour suivre les mises à jour quotidiennes apportées à la table (pour une colonne spécifique)

Select DI.IndividualId,DI.ssn FRom Individual I 
INNER JOIN IndividualAudit A 
ON(I.IndividualId = A.IndividualId and A.UpdateDate = GETDATE()) 
where i.updatedate = GETDATE() and I.ssn <> a.ssn 
group by I.IndividualId,I.ssn 

Quelqu'un peut-il s'il vous plaît me dire si mon approche est correcte.

En fait, je recherche sur Google et a eu peur regardant lien ci-dessous: Query help when using audit table

la personne qui a répondu requête similaire sur ce post semblent être très bon avec sql et en comparant avec sa réponse mon approche semble tout à fait naïve . donc je veux juste savoir où je me trompe dans ma compréhension.

Merci beaucoup

+0

En supposant 'GETDATE' retourne l'heure actuelle, il semble que ce serait seulement obtenir des lignes qui étaient modifiées en ce moment (c.-à-probablement pas). De plus, si la ligne était mise à jour, pourquoi le 'SSN' serait-il différent? Je ne suis pas sûr de ce que les données vont dans la table d'audit - est-ce la valeur précédente de la rangée ou la valeur actuelle (comme mise à jour)? – Mikeb

+0

Salut Mike ... pour getdate() je vais utiliser CONVERT (VARCHAR (10), mydatecol, 110) pour comparer uniquement les dates. La valeur précédente de ligne va à la table d'audit. (il n'y a pas de nécessité ssn devrait différer.Si seulement ssn a différé, je veux choisir la ligne c'est pourquoi <> vérifier) – user2159471

Répondre

0

Au lieu de fixer la requête, je vous suggère au lieu d'utiliser un déclencheur de mise à jour visant spécifiquement les modifications à cette colonne SSN vous êtes préoccupé. La requête que vous avez fournie ne fonctionnera pas à cause de la comparaison des dates (comme l'a signalé user2159471). Mais même après avoir résolu la requête, vous devrez toujours l'exécuter pour voir quels numéros de sécurité ont été mis à jour. Au lieu d'utiliser un déclencheur de mise à jour SQL qui, peut-être, insère une entrée dans une troisième table chaque fois que le SSN d'un individu est modifié. Ensuite, vous pouvez regarder cette table chaque fois que vous, ou exécuter un rapport par rapport à celui-ci, pour voir qui a été changé.

Le code de déclenchement ressemble à ceci:

CREATE TRIGGER MyCoolNewTrigger ON Individual 
FOR UPDATE 
AS 
SET NOCOUNT ON 
IF (UPDATE(SSN)) 
BEGIN 
    Declare @oldSSN as varchar(40) 
    Declare @NewSSN as varchar(40) 
    set @oldSSN = deleted.SSN --holds the old SSN being changes 
    Set @NewSSN = inserted.SSN -- holds the new SSN inserted 
    Insert into IndividualUpdateLog (NewSSN, OldSSN, ChangeDate) 
    values (@NewSSN, @oldSSN, getdate)  
END 
Questions connexes