Appliquer des loggings datés effectifs en SQL

Supposons que j'ai un logging avec une colonne appelée "Nom". Chaque logging peut être daté, donc j'ai aussi une date d'input en vigueur et une colonne de date d'expiration.

La colonne "Nom" doit être unique, mais uniquement dans les périodes de chevauchement de la date d'input en vigueur et de la date d'expiration. Je suis à la search d'une manière efficace d'appliquer cela à partir de l'arrière-plan sql (j'utilise ms sql 2008).

Vous utiliseriez un triggersur INSERT / UPDATE pour cela.

L'exemple C sur cette page est similaire à ce dont vous avez besoin. Inserted est une pseudo table que vous pouvez utiliser pour joindre vos loggings insérés / mis à jour à votre table pour voir s'il y a d'autres loggings avec des dates qui se chevauchent,

Voici le model de données

 Table A ( name char (32) not null, effdt date not null, effseq int not null, effstatus char (1) not null, other data columns .. ) 

Primary_Key A_Key (nom, effdt, effseq);

Voici datatables:

 'A', '1/1/2009', 1, 'A', 'Otherdata' 'A', '1/1/2009', 2, 'A', 'Otherdata 2' 'B', '1/1/2009', 1, 'A', 'B data' 'B', '1/1/2009', 2, 'I', 'B Data' 

Voici les règles:

Utilisez Effdt pour save la date à laquelle la ligne doit être utilisée ou effective. Ce n'est peut-être pas la date à laquelle datatables sont stockées / créées.

Utilisez Effseq pour stocker plusieurs mises à jour à n'importe quelle date. Il devrait toujours commencer par 1.

Utilisez EFFStatus pour désactiver datatables. Ne supprimez jamais datatables dans un schéma daté efficace. La suppression rend également les activités d'audit difficiles.

Lorsque vous "mettez à jour" une ligne, ne mettez jamais à jour la colonne EFFDT. Toujours créer une nouvelle ligne avec le nouvel EFFDT. Si EFFDT existe déjà, utilisez l'EFFSEQ suivant.

Cela peut être une bonne idée de stocker le updateuserid et updatetimestamp également dans la ligne. Surtout si vous voulez garder une trace des changements.

Voici les requêtes:

Pour get toutes datatables:

 Select * from A 

Pour get toutes les "lignes actives" à partir d'aujourd'hui:

 Select * from A A1 where effdt = (select max (EFFDT) from A where name= A1.name and effdt <= getdate()) and effseq = (select max(effseq) from A where name=A1.name and effdt=A1.effdt) and eff_status = 'A' 

Pour get toutes les lignes à partir d'une date donnée passée / future:

Remplacez le getdate () avec la date réelle dans le ci-dessus.

Si vous écrivez une application Web, voici les règles du champ de formulaire:

Insérer le formulaire:

 EFFDT : Editable, Default Value = Today EFFSEQ : Non Editable, Default Value = "#Next". Interpret what is "Next" in the backend. 

Mettre à jour le formulaire:

 EFFDT : Editable, Default= current Value. EFFSEQ : Non-Editable, Default = "#Next" 

Supprimer le formulaire:

 All data non editable, On Delete Action, set EFF_STATUS='I' 

Histoire Modifier:

 This is a "super user" feature only. EFFDT = Non Editable, Default is Current Date EFFSEQ = Non-Editable, Default is Current Value 

Tous les autres champs modifiables, et effectuez une véritable mise à jour sur la ligne.