[{"data":1,"prerenderedAt":781},["ShallowReactive",2],{"navigation_docs_fr":3,"-fr-using-dashboards-rls":242,"-fr-using-dashboards-rls-surround":778},[4,17,42,206,233],{"title":5,"redirect":6,"path":7,"stem":8,"children":9,"page":16},"Introduction","\u002Ffr\u002Fintroduction\u002Fintroduction","\u002Ffr\u002Fintroduction","fr\u002F1.introduction",[10,12],{"title":5,"path":6,"stem":11},"fr\u002F1.introduction\u002F1.introduction",{"title":13,"path":14,"stem":15},"Prérequis","\u002Ffr\u002Fintroduction\u002Fprerequisites","fr\u002F1.introduction\u002F2.prerequisites",false,{"title":18,"redirect":19,"path":20,"stem":21,"children":22,"page":16},"Installation","\u002Ffr\u002Finstallation\u002Fsetup","\u002Ffr\u002Finstallation","fr\u002F2.installation",[23,26,30,34,38],{"title":24,"path":19,"stem":25},"Configuration de la machine","fr\u002F2.installation\u002F1.setup",{"title":27,"path":28,"stem":29},"L'histoire de deux repos","\u002Ffr\u002Finstallation\u002Ftale-repos","fr\u002F2.installation\u002F2.tale-repos",{"title":31,"path":32,"stem":33},"Connexion à la base de données","\u002Ffr\u002Finstallation\u002Fdbt-profile","fr\u002F2.installation\u002F3.dbt-profile",{"title":35,"path":36,"stem":37},"Test de fumée","\u002Ffr\u002Finstallation\u002Fsmoke-testing","fr\u002F2.installation\u002F4.smoke-testing",{"title":39,"path":40,"stem":41},"Et maintenant?","\u002Ffr\u002Finstallation\u002Fwhat-now","fr\u002F2.installation\u002F5.what-now",{"title":43,"path":44,"stem":45,"children":46,"page":16},"Guide utilisateur","\u002Ffr\u002Fusing","fr\u002F3.using",[47,50,54,88,188,202],{"title":5,"path":48,"stem":49},"\u002Ffr\u002Fusing\u002Fintroduction","fr\u002F3.using\u002F1.introduction",{"title":51,"path":52,"stem":53},"Exécuter l'ETL","\u002Ffr\u002Fusing\u002Frunning","fr\u002F3.using\u002F2.running",{"title":55,"path":56,"stem":57,"children":58,"page":16},"Configuration","\u002Ffr\u002Fusing\u002Fconfiguration","fr\u002F3.using\u002F3.configuration",[59,72,76,80,84],{"title":60,"path":61,"stem":62,"children":63,"page":16},"Architecture","\u002Ffr\u002Fusing\u002Fconfiguration\u002Farchitecture","fr\u002F3.using\u002F3.configuration\u002F1.architecture",[64,68],{"title":65,"path":66,"stem":67},"Vue d'ensemble","\u002Ffr\u002Fusing\u002Fconfiguration\u002Farchitecture\u002Foverview","fr\u002F3.using\u002F3.configuration\u002F1.architecture\u002F1.overview",{"title":69,"path":70,"stem":71},"Marts et couche reporting","\u002Ffr\u002Fusing\u002Fconfiguration\u002Farchitecture\u002Fmarts-reporting","fr\u002F3.using\u002F3.configuration\u002F1.architecture\u002F2.marts-reporting",{"title":73,"path":74,"stem":75},"Lier les bases de données","\u002Ffr\u002Fusing\u002Fconfiguration\u002Fdatabases","fr\u002F3.using\u002F3.configuration\u002F2.databases",{"title":77,"path":78,"stem":79},"Adapters et seeds","\u002Ffr\u002Fusing\u002Fconfiguration\u002Fadapts-seeds","fr\u002F3.using\u002F3.configuration\u002F3.adapts-seeds",{"title":81,"path":82,"stem":83},"Activer une ressource","\u002Ffr\u002Fusing\u002Fconfiguration\u002Fenabling","fr\u002F3.using\u002F3.configuration\u002F4.enabling",{"title":85,"path":86,"stem":87},"Overriding","\u002Ffr\u002Fusing\u002Fconfiguration\u002Foverriding","fr\u002F3.using\u002F3.configuration\u002F5.overriding",{"title":89,"redirect":90,"path":91,"stem":92,"children":93,"page":16},"Tableaux de bord","\u002Ffr\u002Fusing\u002F","\u002Ffr\u002Fusing\u002Fdashboards","fr\u002F3.using\u002F4.dashboards",[94,97,126,167,176,184],{"title":5,"path":95,"stem":96},"\u002Ffr\u002Fusing\u002Fdashboards\u002Fintroduction","fr\u002F3.using\u002F4.dashboards\u002F1.introduction",{"title":98,"redirect":99,"path":99,"stem":100,"children":101,"page":16},"Ressources humaines","\u002Ffr\u002Fusing\u002Fdashboards\u002Fhr","fr\u002F3.using\u002F4.dashboards\u002F2. hr",[102,106,110,114,118,122],{"title":103,"path":104,"stem":105},"Congés des employés","\u002Ffr\u002Fusing\u002Fdashboards\u002Fhr\u002Femp_conge","fr\u002F3.using\u002F4.dashboards\u002F2. hr\u002F1.emp_conge",{"title":107,"path":108,"stem":109},"Employés actifs","\u002Ffr\u002Fusing\u002Fdashboards\u002Fhr\u002Fempl_actif","fr\u002F3.using\u002F4.dashboards\u002F2. hr\u002F2.empl_actif",{"title":111,"path":112,"stem":113},"Retraite","\u002Ffr\u002Fusing\u002Fdashboards\u002Fhr\u002Fretirement","fr\u002F3.using\u002F4.dashboards\u002F2. hr\u002F3.retirement",{"title":115,"path":116,"stem":117},"Efficacité","\u002Ffr\u002Fusing\u002Fdashboards\u002Fhr\u002Fefficacite","fr\u002F3.using\u002F4.dashboards\u002F2. hr\u002F4.efficacite",{"title":119,"path":120,"stem":121},"Absences des employé(e)s","\u002Ffr\u002Fusing\u002Fdashboards\u002Fhr\u002Femp_abs","fr\u002F3.using\u002F4.dashboards\u002F2. hr\u002F5.emp_abs",{"title":123,"path":124,"stem":125},"Resignation","\u002Ffr\u002Fusing\u002Fdashboards\u002Fhr\u002Fresignation","fr\u002F3.using\u002F4.dashboards\u002F2. hr\u002F6.resignation",{"title":127,"redirect":128,"path":128,"stem":129,"children":130,"page":16},"Services éducatifs","\u002Ffr\u002Fusing\u002Fdashboards\u002Feduc-serv","fr\u002F3.using\u002F4.dashboards\u002F3.educ-serv",[131,135,139,143,147,151,155,159,163],{"title":132,"path":133,"stem":134},"Résultats aux épreuves","\u002Ffr\u002Fusing\u002Fdashboards\u002Feduc-serv\u002Fres_epreuves","fr\u002F3.using\u002F4.dashboards\u002F3.educ-serv\u002F1.res_epreuves",{"title":136,"path":137,"stem":138},"Suivi des résultats des élèves","\u002Ffr\u002Fusing\u002Fdashboards\u002Feduc-serv\u002Fsuivi_resultats","fr\u002F3.using\u002F4.dashboards\u002F3.educ-serv\u002F2.suivi_resultats",{"title":140,"path":141,"stem":142},"Effectif des élèves","\u002Ffr\u002Fusing\u002Fdashboards\u002Feduc-serv\u002Feffectif_css","fr\u002F3.using\u002F4.dashboards\u002F3.educ-serv\u002F3.effectif_css",{"title":144,"path":145,"stem":146},"Absentéisme des élèves","\u002Ffr\u002Fusing\u002Fdashboards\u002Feduc-serv\u002Fchronic_absenteeism","fr\u002F3.using\u002F4.dashboards\u002F3.educ-serv\u002F4.chronic_absenteeism",{"title":148,"path":149,"stem":150},"Résultats scolaires","\u002Ffr\u002Fusing\u002Fdashboards\u002Feduc-serv\u002Fres_scolaires","fr\u002F3.using\u002F4.dashboards\u002F3.educ-serv\u002F5.res_scolaires",{"title":152,"path":153,"stem":154},"Modélisation prédictive - agrégée","\u002Ffr\u002Fusing\u002Fdashboards\u002Feduc-serv\u002Fpredictive-aggregated","fr\u002F3.using\u002F4.dashboards\u002F3.educ-serv\u002F6.predictive-aggregated",{"title":156,"path":157,"stem":158},"PEVR","\u002Ffr\u002Fusing\u002Fdashboards\u002Feduc-serv\u002Fpevr","fr\u002F3.using\u002F4.dashboards\u002F3.educ-serv\u002F7.pevr",{"title":160,"path":161,"stem":162},"Absentéisme","\u002Ffr\u002Fusing\u002Fdashboards\u002Feduc-serv\u002Fabsenteeism","fr\u002F3.using\u002F4.dashboards\u002F3.educ-serv\u002F8.absenteeism",{"title":164,"path":165,"stem":166},"Diplôme","\u002Ffr\u002Fusing\u002Fdashboards\u002Feduc-serv\u002Fdiplome","fr\u002F3.using\u002F4.dashboards\u002F3.educ-serv\u002F9.diplome",{"title":168,"redirect":169,"path":169,"stem":170,"children":171,"page":16},"Organisation scolaire","\u002Ffr\u002Fusing\u002Fdashboards\u002Fschool-org","fr\u002F3.using\u002F4.dashboards\u002F4.school-org",[172],{"title":173,"path":174,"stem":175},"Anomalies","\u002Ffr\u002Fusing\u002Fdashboards\u002Fschool-org\u002Fanomalies","fr\u002F3.using\u002F4.dashboards\u002F4.school-org\u002F1.anomalies",{"title":177,"path":178,"stem":179,"children":180,"page":16},"DirectionGenerale","\u002Ffr\u002Fusing\u002Fdashboards\u002Fdirection_generale","fr\u002F3.using\u002F4.dashboards\u002F5.direction_generale",[181],{"title":156,"path":182,"stem":183},"\u002Ffr\u002Fusing\u002Fdashboards\u002Fdirection_generale\u002Fpevr","fr\u002F3.using\u002F4.dashboards\u002F5.direction_generale\u002F1.pevr",{"title":185,"path":186,"stem":187},"Row Level Security","\u002Ffr\u002Fusing\u002Fdashboards\u002Frls","fr\u002F3.using\u002F4.dashboards\u002F5.rls",{"title":189,"redirect":90,"path":190,"stem":191,"children":192,"page":16},"Marts de données","\u002Ffr\u002Fusing\u002Fmarts","fr\u002F3.using\u002F6.marts",[193,196,199],{"title":5,"path":194,"stem":195},"\u002Ffr\u002Fusing\u002Fmarts\u002Fmarts","fr\u002F3.using\u002F6.marts\u002F1.marts",{"title":127,"path":197,"stem":198},"\u002Ffr\u002Fusing\u002Fmarts\u002Feducational-service","fr\u002F3.using\u002F6.marts\u002F2.educational-service",{"title":98,"path":200,"stem":201},"\u002Ffr\u002Fusing\u002Fmarts\u002Fhuman-resources","fr\u002F3.using\u002F6.marts\u002F3.human-resources",{"title":203,"path":204,"stem":205},"Checklist de production","\u002Ffr\u002Fusing\u002Fproduction","fr\u002F3.using\u002F7.production",{"title":207,"redirect":208,"path":209,"stem":210,"children":211,"page":16},"Guide développeur","\u002Ffr\u002Fcontributing\u002Fgetting-started","\u002Ffr\u002Fcontributing","fr\u002F4.contributing",[212,215,224],{"title":213,"path":208,"stem":214},"Premiers pas","fr\u002F4.contributing\u002F1.getting-started",{"title":216,"redirect":217,"path":218,"stem":219,"children":220,"page":16},"Conventions","\u002Ffr\u002Fcontributing\u002Fconventions\u002Fgetting-started","\u002Ffr\u002Fcontributing\u002Fconventions","fr\u002F4.contributing\u002F2.conventions",[221],{"title":222,"path":217,"stem":223},"Getting Started","fr\u002F4.contributing\u002F2.conventions\u002F1.getting-started",{"title":225,"path":226,"stem":227,"children":228,"page":16},"Référence docs","\u002Ffr\u002Fcontributing\u002Fdocs","fr\u002F4.contributing\u002F99.docs",[229],{"title":230,"path":231,"stem":232},"Composants","\u002Ffr\u002Fcontributing\u002Fdocs\u002Fcomponents","fr\u002F4.contributing\u002F99.docs\u002F1.components",{"title":234,"redirect":6,"path":235,"stem":236,"children":237,"page":16},"Migrations","\u002Ffr\u002Fmigrations","fr\u002F5.migrations",[238],{"title":239,"path":240,"stem":241},"V0.17 -> V0.18","\u002Ffr\u002Fmigrations\u002Fv0.17_to_v0.18","fr\u002F5.migrations\u002F1.v0.17_to_v0.18",{"id":243,"title":185,"body":244,"description":488,"extension":772,"links":773,"meta":774,"navigation":775,"path":186,"seo":776,"stem":187,"__hash__":777},"docs_fr\u002Ffr\u002F3.using\u002F4.dashboards\u002F5.rls.md",{"type":245,"value":246,"toc":756},"minimark",[247,252,256,261,270,274,288,302,306,310,322,331,336,362,366,400,526,530,533,540,545,558,564,655,659,665,694,700,721,725,728,752],[248,249,251],"alert",{"type":250},"danger","Cette page est une ébauche. Vous devrez la déchiffrer en attendant que je trouve le temps de la compléter :(",[253,254,5],"h1",{"id":255},"introduction",[257,258,260],"h2",{"id":259},"quest-ce-que-la-rls","Qu'est-ce que la RLS?",[262,263,264,265,269],"p",{},"La RLS, ou ",[266,267,268],"em",{},"Row-Level Security",", est une méthode qui restreint l'accès aux données dans une base de données ou un environnement de BI selon les caractéristiques de l'utilisateur. Elle permet aux administrateurs de contrôler qui peut voir quelles données dans une même table ou un même rapport. C'est particulièrement utile lorsque certaines données sensibles ou privées ne doivent être accessibles qu'à certains utilisateurs.",[257,271,273],{"id":272},"quelle-est-la-différence-avec-le-rbac","Quelle est la différence avec le RBAC?",[262,275,276,277,280,281,284,285,287],{},"La RLS dans ",[266,278,279],{},"Power BI"," permet de contrôler l'accès aux lignes de données selon l'utilisateur qui consulte le rapport. Vous pouvez créer des filtres dans des rôles définis dans ",[266,282,283],{},"Power BI Desktop","; lorsque les utilisateurs se connectent à ",[266,286,279],{},", ils ne voient que les données correspondant à ces filtres.",[262,289,290,291,294,295,297,298,301],{},"Le RBAC, ou ",[266,292,293],{},"Role-Based Access Control",", est plus large et contrôle l'accès à des niveaux plus élevés de l'environnement ",[266,296,279],{},", pas seulement au niveau des données. Le RBAC sert à gérer qui a accès aux espaces de travail, rapports et ",[266,299,300],{},"dashboards",", ainsi que les opérations permises, comme lire, écrire, partager ou supprimer.",[253,303,305],{"id":304},"comment-activer-la-rls","Comment activer la RLS",[257,307,309],{"id":308},"ce-dont-vous-aurez-besoin","Ce dont vous aurez besoin",[248,311,313,314,318,319,321],{"type":312},"info","La \"table des utilisateurs\" doit être implémentée selon votre propre logique d'affaires. Dans cet exemple, nous supposons que l'identification se fait avec l'",[315,316,317],"strong",{},"adresse courriel"," utilisée pour se connecter à ",[266,320,279],{},". Si vous utilisez une autre méthode d'authentification, vous devrez adapter l'exemple.",[323,324,326,327],"h3",{"id":325},"la-table-users","La table ",[328,329,330],"code",{},"users",[262,332,326,333,335],{},[328,334,330],{}," associe chaque utilisateur ayant accès aux données avec les données qu'il peut voir. Elle devrait être structurée ainsi:",[337,338,339,353],"ul",{},[340,341,342,345,346,349,350,352],"li",{},[328,343,344],{},"user_id",": l'identifiant unique de l'utilisateur, qui peut être rattaché à un élément du ",[266,347,348],{},"payload"," d'authentification ",[266,351,279],{},".",[340,354,355,358,359,352],{},[328,356,357],{},"scope",": la portée des données disponibles pour l'utilisateur. C'est une chaîne utilisée pour filtrer les données de ",[315,360,361],{},"reporting",[257,363,365],{"id":364},"comment-configurer-la-rls","Comment configurer la RLS?",[262,367,368,369,372,373,376,377,379,380,382,383,385,386,388,389,376,391,393,394,396,397,399],{},"La RLS est implémentée en ajoutant la ",[328,370,371],{},"user_table"," à votre ",[266,374,375],{},"dashboard"," ",[266,378,279],{}," et en la joignant, par jointure interne, à la table de ",[266,381,361],{},". La ",[328,384,371],{}," peut ensuite filtrer les données de la table de ",[266,387,361],{}," selon les droits accordés à l'utilisateur.\nPour cela, vous devez créer un nouveau rôle dans votre ",[266,390,375],{},[266,392,279],{}," et ajouter un filtre à la table de ",[266,395,361],{}," qui limite les données selon le ",[328,398,357],{}," de l'utilisateur.",[401,402,403,417,437],"ol",{},[340,404,405,406,408,409,382,411,413,414,352],{},"Assurez-vous que votre modèle de données contient les colonnes nécessaires pour définir les filtres RLS. En pratique, les dimensions auxquelles vous voulez appliquer la RLS doivent être disponibles dans la table de ",[266,407,361],{}," et dans la ",[328,410,371],{},[328,412,371],{}," doit aussi inclure une colonne d'identification principale de l'utilisateur, ici la colonne ",[328,415,416],{},"email",[340,418,419,420,422,423,376,425,427,428,430,431,433,434,352],{},"Importez la ",[328,421,371],{}," dans votre ",[266,424,375],{},[266,426,279],{}," et créez une relation entre la ",[328,429,371],{}," et les tables de ",[266,432,361],{},". ",[315,435,436],{},"La jointure doit se faire sur la colonne de portée",[340,438,439,440,482,498],{},"Créez et gérez un rôle:\n",[401,441,442,455,462,472],{},[340,443,444,445,447,448,451,452,352],{},"Dans ",[266,446,283],{},", cliquez sur l'onglet ",[328,449,450],{},"Model",", puis sur ",[328,453,454],{},"Manage Roles",[340,456,457,458,461],{},"Cliquez sur ",[328,459,460],{},"Create"," pour créer un nouveau rôle.",[340,463,464,465,468,469,352],{},"Dans la boîte de dialogue ",[328,466,467],{},"Manage roles",", entrez un nom de rôle, puis cliquez sur ",[328,470,471],{},"Add Table Filter",[340,473,474,475,478,479,481],{},"Dans la boîte ",[328,476,477],{},"Table Filter DAX Expression",", entrez une expression DAX qui filtre les données selon l'adresse courriel de l'utilisateur. Cela sert à filtrer la table des utilisateurs sur la personne qui consulte actuellement le ",[266,480,375],{},". Par exemple:",[483,484,489],"pre",{"className":485,"code":486,"language":487,"meta":488,"style":488},"language-dax shiki shiki-themes material-theme-lighter material-theme material-theme-palenight"," 'user_table'[email] = USERPRINCIPALNAME()\n","dax","",[328,490,491],{"__ignoreMap":488},[492,493,496],"span",{"class":494,"line":495},"line",1,[492,497,486],{},[401,499,501,507,513,521],{"start":500},5,[340,502,457,503,506],{},[328,504,505],{},"OK"," pour enregistrer l'expression DAX.",[340,508,457,509,512],{},[328,510,511],{},"Save"," pour enregistrer le rôle.",[340,514,457,515,518,519,352],{},[328,516,517],{},"Close"," pour fermer la boîte ",[328,520,467],{},[340,522,523,524,352],{},"Publiez le rapport dans le service ",[266,525,279],{},[323,527,529],{"id":528},"exemple-implémenter-la-rls-au-niveau-de-lécole","Exemple: implémenter la RLS au niveau de l'école",[262,531,532],{},"Dans cet exemple, nous implémentons la RLS pour restreindre l'accès aux données selon l'adresse courriel de l'utilisateur, afin que chaque utilisateur ne voie que les données de l'école à laquelle il est associé.",[534,535,537,538],"h4",{"id":536},"étape-1-créer-la-table-users","Étape 1: créer la table ",[328,539,330],{},[262,541,326,542,544],{},[328,543,330],{}," devrait contenir les colonnes suivantes:",[337,546,547,552],{},[340,548,549,551],{},[328,550,416],{},": l'adresse courriel de l'utilisateur",[340,553,554,557],{},[328,555,556],{},"school",": l'école associée à l'utilisateur",[534,559,561,562],{"id":560},"étape-2-implémenter-la-rls-dans-power-bi","Étape 2: implémenter la RLS dans ",[266,563,279],{},[401,565,566,598],{},[340,567,568,569,422,571,376,573,575,576,430,578,433,580,585,586,352],{},"Importez la table ",[328,570,330],{},[266,572,375],{},[266,574,279],{}," et créez une relation entre la table ",[328,577,330],{},[266,579,361],{},[315,581,582,583],{},"La jointure doit se faire sur la colonne ",[328,584,556],{},". C'est le point important: ",[315,587,588,589,591,592,594,595,597],{},"si votre table de ",[266,590,361],{}," NE contient PAS de colonne ",[328,593,556],{},", vous ne pourrez pas joindre la ",[328,596,371],{}," et vous ne pourrez pas appliquer de RLS à cette table",[340,599,600,601,626,635],{},"Créez un rôle:\n",[401,602,603,611,615,621],{},[340,604,444,605,447,607,451,609,352],{},[266,606,283],{},[328,608,450],{},[328,610,454],{},[340,612,457,613,461],{},[328,614,460],{},[340,616,464,617,468,619,352],{},[328,618,467],{},[328,620,471],{},[340,622,474,623,625],{},[328,624,477],{},", entrez une expression DAX qui filtre les données selon l'adresse courriel de l'utilisateur. Par exemple:",[483,627,629],{"className":485,"code":628,"language":487,"meta":488,"style":488}," user_table['email'] = USERPRINCIPALNAME()\n",[328,630,631],{"__ignoreMap":488},[492,632,633],{"class":494,"line":495},[492,634,628],{},[401,636,637,641,645,651],{"start":500},[340,638,457,639,506],{},[328,640,505],{},[340,642,457,643,512],{},[328,644,511],{},[340,646,457,647,518,649,352],{},[328,648,517],{},[328,650,467],{},[340,652,523,653,352],{},[266,654,279],{},[534,656,658],{"id":657},"pourquoi-ça-fonctionne","Pourquoi ça fonctionne?",[262,660,661,662,664],{},"Voici ce qui se passe lorsqu'un utilisateur consulte le rapport, au coeur du moteur ",[266,663,279],{},":",[401,666,667,673,682,688],{},[340,668,669,670,672],{},"L'utilisateur se connecte à ",[266,671,279],{}," avec son courriel et le rapport s'affiche.",[340,674,675,677,678,681],{},[266,676,279],{}," assigne ",[328,679,680],{},"USERPRINCIPALNAME()"," au courriel de l'utilisateur.",[340,683,684,685,687],{},"L'expression DAX du rôle est évaluée, et la ",[328,686,371],{}," est filtrée sur le courriel de l'utilisateur.",[340,689,690,691,693],{},"Les tables jointes à la ",[328,692,371],{}," sont maintenant filtrées selon ce courriel, et l'utilisateur ne voit que les données de l'école à laquelle il est associé.",[323,695,697,698],{"id":696},"note-sur-userprincipalname","Note sur ",[328,699,680],{},[262,701,702,704,705,708,709,711,712,714,715,717,718,720],{},[328,703,680],{}," est une fonction DAX qui retourne l'",[315,706,707],{},"adresse courriel de l'utilisateur actuellement authentifié",". Cette fonction est disponible seulement dans le service ",[266,710,279],{},", pas dans ",[266,713,283],{},". Une fois le rapport publié dans le service ",[266,716,279],{},", ",[328,719,680],{}," retourne le courriel de l'utilisateur qui consulte le rapport. C'est utile pour filtrer les données selon l'adresse courriel.",[323,722,724],{"id":723},"mon-client-veut-une-rls-au-niveau-de-lécole-mais-aussi-au-niveau-de-la-classe-comment-faire","Mon client veut une RLS au niveau de l'école, mais aussi au niveau de la classe. Comment faire?",[248,726,727],{"type":312},"Implémenter la RLS sur plusieurs colonnes est en fait assez simple: l'astuce consiste à transformer la jointure multi-colonnes en jointure sur une seule colonne. \"Si on n'a pas de problème au départ, on n'a pas besoin de chercher une solution\" - Confucius, probablement pas, mais l'idée tient.",[262,729,730,731,733,734,742,743,751],{},"Comme ",[266,732,279],{}," ne gère pas les jointures multi-colonnes, il faut concaténer les colonnes de jointure dans une seule colonne. Pour cela, créez une nouvelle colonne dans ",[315,735,736,737,739,740],{},"toutes vos tables de ",[266,738,361],{}," et dans vos tables ",[328,741,371],{},". La colonne unique peut être créée en concaténant simplement les colonnes à joindre. Bien sûr, l'ordre de concaténation ",[315,744,745,746,748,749],{},"doit être exactement le même dans la ",[328,747,371],{}," et dans la table de ",[266,750,361],{},", sinon la jointure ne fonctionnera pas. Si vous voulez faire plus élégant, vous pouvez le faire en SQL AVANT d'importer les données et utiliser le hachage de la concaténation comme colonne de jointure au lieu de la concaténation elle-même, afin d'économiser quelques précieux octets de mémoire.",[753,754,755],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":488,"searchDepth":757,"depth":757,"links":758},2,[759,760,761,766],{"id":259,"depth":757,"text":260},{"id":272,"depth":757,"text":273},{"id":308,"depth":757,"text":309,"children":762},[763],{"id":325,"depth":764,"text":765},3,"La table users",{"id":364,"depth":757,"text":365,"children":767},[768,769,771],{"id":528,"depth":764,"text":529},{"id":696,"depth":764,"text":770},"Note sur USERPRINCIPALNAME()",{"id":723,"depth":764,"text":724},"md",null,{},true,{"title":185,"description":488},"g62yomTxP1PsyhnVimVPBmVhiQaFx1KXnSzBYUEvDKA",[779,780],{"title":156,"path":182,"stem":183,"description":488,"children":-1},{"title":5,"path":194,"stem":195,"description":488,"children":-1},1781106573298]