J'ai actuellement une base de données complète des entrées ACL qui ressemble à ceci:Quel est le moyen le plus efficace d'analyser ces lignes de 500k?
Je dois aller à travers et analyser la différence entre un nœud racine (comme \\ chrlcltsvr02 \ AYY_LMO \ ClientServices) et c'est des nœuds enfants (ex. \\ chrlcltsvr02 \ AYY_LMO \ ClientServices \ Client1).
J'ai essayé de faire cela en code C# en utilisant un ORM et T-SQL brute comme si (je ne sais en fait que l'ouverture d'une session par ligne est une idée horrible):
foreach (string path in distinctPaths)
{
using (session = sessionFactory.OpenSession())
{
string query;
query = String.Format("SELECT DISTINCT UserGroup, AllowDeny, Permissions FROM FilerACLs WHERE FullPath LIKE '{0}'", path.Replace("'", "''"));
var parentACLs = session.CreateSQLQuery(query).SetResultTransformer(Transformers.AliasToBean<ShareACLEntry>()).List<ShareACLEntry>();
query = String.Format("SELECT DISTINCT UserGroup, AllowDeny, Permissions FROM FilerACLs WHERE FullPath LIKE '{0}\\%'", path.Replace("'", "''"));
var childACLs = session.CreateSQLQuery(query).SetResultTransformer(Transformers.AliasToBean<ShareACLEntry>()).List<ShareACLEntry>();
if (childACLs.Except(parentACLs, comparer).ToList().Count > 0)
Console.WriteLine("{0} has diffs!", path);
}
}
Et enfin, comparer les données obtenues pour voir si les nœuds enfants diffèrent du nœud racine. Par différence, je veux dire si j'ai une liste de contrôle d'accès pour le groupe "CLT-AD \ Accès total partagé-CHRL" avec un contrôle total autorisé sur le nœud parent et non sur le nœud enfant, je voudrais noter que le ACL existe sur l'enfant mais pas sur le parent. Malheureusement, ce processus est beaucoup trop lent pour analyser les 500 000 rangées dans une période de temps décente. Je voudrais savoir si quelqu'un a une idée pour déterminer efficacement s'il y a des différences dans les données - que ce soit en utilisant directement T-SQL, une fonction SQL CLR, ou un meilleur algorithme en général.
Veuillez me faire savoir si une clarification est nécessaire.
Merci!
EDIT
Depuis que je suis devenu une bonne quantité de haine sur cette question me laisse re-préciser exactement ce que je cherche moins les approches ont échoué, je l'ai indiqué plus haut.
J'ai récemment effectué une analyse sur environ 1 000 dossiers partagés sur un serveur Windows. Cette analyse est récursive depuis le répertoire de niveau supérieur tout le long de la hiérarchie des dossiers et, pour chaque dossier, elle enregistre une ligne pour chaque liste de contrôle d'accès.
La base de données ressemble donc à la capture d'écran ci-dessus. Ce que je dois faire est de tirer un rapport de cette base de données qui détaille la différence (ou même s'il y en a) entre les ACL enregistrés à partir d'un répertoire de niveau supérieur et les ACL enregistrées pour n'importe quel répertoire sous ce répertoire de premier niveau.
J'espère que cela a plus de sens.
ce n'est pas du code C# c'est TSQL. Qu'entendez-vous par "différences"? – Jodrell
Désolé j'ai oublié de mentionner que j'ai utilisé un ORM pour convertir le résultat du SQL brut en un objet CLR. – slashp
Vous devrez montrer votre code C# pour nous faire savoir si ce que vous faites là peut être traduit en une solution purement SQL, ou pour voir si l'algorithme peut être amélioré. – juharr