Modèle pour surcharger les loggings db

Je cherche un model ou un exemple de code où un user peut entrer ses propres loggings, qui remplacent les loggings par défaut.

Par exemple, une table de vacances, les loggings par défaut peuvent être:

HolidayName Holiday Date CompanyId ----------- ------------ --------- New Year 01-Jan-2016 NULL Day After 02-Jan-2016 NULL 

Et après que l'user ajoute ses propres vacances (pour CompanyId "1234"):

 HolidayName Holiday Date CompanyId ----------- ------------ --------- New Year 01-Jan-2016 NULL Day After 02-Jan-2016 NULL Another Name 01-Jan-2016 1234 My Holiday 03-Jan-2016 1234 Joes Holiday 04-Jan-2016 5678 

Comment puis-je récupérer une list de jours fériés qui sont une combinaison de:

  1. les jours fériés par défaut (où CompanyId = NULL), ou
  2. les jours fériés (avec la même date),
  3. Et inclut les jours fériés supplémentaires entrés par l'user (par CompanyID).

Comme ceci pour companyId = 1234:

 HolidayName Holiday Date CompanyId ----------- ------------ --------- Another Name 01-Jan-2016 1234 Day After 02-Jan-2016 NULL My Holiday 03-Jan-2016 1234 

Je ne sais pas si cela peut être fait dans une vue SQL, un code Query ou C #.

On dirait que si vous normalisé vos données un peu plus, cela aiderait énormément:

 Table: Company CompanyId --------- 1234 5678 Table: CompanyHoliday Id CompanyId HolidayId ------------------------------------ 1 1234 3 2 1234 4 3 5678 5 Table: Holiday Id OccursOn IsDefault Name ---------------------------------- 1 01-01-2016 1 New Year 2 01-02-2016 1 Day After 3 01-01-2016 0 Another Name 4 01-03-2016 0 My Holiday 5 01-04-2016 0 Joes Holiday 

Ensuite, comme Mark Brackett l'a mentionné, lorsque vous créez une nouvelle société, créez un ou plusieurs loggings associés dans la table CompanyHoliday pour la nouvelle société des jours fériés par défaut.

Pour votre cas spécifique, vous devez simplement faire une jointure complète sur les dates (puisque vous montrez seulement un user ajoutant des vacances ou renommant celles qui existent déjà):

 SELECT COALESCE(User.HolidayName, Default.HolidayName) as HolidayName, COALESCE(User.HolidayDate, Default.HolidayDate) as HolidayDate, User.CompanyId FROM Holidays as User FULL OUTER JOIN ( SELECT * FROM Holidays WHERE CompanyId IS NULL ) as Default ON User.HolidayDate = Default.HolidayDate WHERE User.CompanyId = 1234 

Cependant, cela ne permet pas à un user de supprimer un jour férié. Vous pouvez résoudre ce problème en créant un Holiday User avec un indicateur IsDeleted – mais personnellement, j'opterais probablement pour une routine d'initialisation par copy qui serait plus simple et plus flexible. Cela nécessite un code de fusion si vous déployez de nouvelles vacances "par défaut" dans le futur, mais c'est plutôt sortingvial.