{"id":20024,"date":"2024-02-07T06:24:15","date_gmt":"2024-02-07T05:24:15","guid":{"rendered":"https:\/\/complex-systems-ai.com\/?page_id=20024"},"modified":"2024-02-13T07:20:13","modified_gmt":"2024-02-13T06:20:13","slug":"exercices-sql-vues","status":"publish","type":"page","link":"https:\/\/complex-systems-ai.com\/es\/analisis-de-software\/ejercicios-corregidos-de-integridad-y-vistas-de-sql\/","title":{"rendered":"3 SQL (Vistas, integridad y derechos)"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"20024\" class=\"elementor elementor-20024\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-a997e8c elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"a997e8c\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-d5b6d99\" data-id=\"d5b6d99\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-1fd4a2a elementor-align-justify elementor-widget elementor-widget-button\" data-id=\"1fd4a2a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-button-wrapper\">\n\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm\" href=\"https:\/\/complex-systems-ai.com\/analyse-logicielle\/\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">Analyse Logicielle<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-7c80e59\" data-id=\"7c80e59\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-161fd0e elementor-align-justify elementor-widget elementor-widget-button\" data-id=\"161fd0e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-button-wrapper\">\n\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm\" href=\"https:\/\/complex-systems-ai.com\/\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">Page d'accueil<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-8bf9429\" data-id=\"8bf9429\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-134953f elementor-align-justify elementor-widget elementor-widget-button\" data-id=\"134953f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-button-wrapper\">\n\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm\" href=\"https:\/\/fr.wikipedia.org\/wiki\/UML_(informatique)\" target=\"_blank\" rel=\"noopener\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">Wiki<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-7966f31 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"7966f31\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-b4eff05\" data-id=\"b4eff05\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-1e2da04 elementor-widget elementor-widget-heading\" data-id=\"1e2da04\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_82_2 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Contenus<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Alternar tabla de contenidos\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/complex-systems-ai.com\/es\/analisis-de-software\/ejercicios-corregidos-de-integridad-y-vistas-de-sql\/#Exercices-Corriges-en-SQL-Integrite-vues-et-confidentialite\" >Exercices Corrig\u00e9s en SQL - Int\u00e9grit\u00e9, vues et confidentialit\u00e9<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/complex-systems-ai.com\/es\/analisis-de-software\/ejercicios-corregidos-de-integridad-y-vistas-de-sql\/#Enonce\" >Enonc\u00e9<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/complex-systems-ai.com\/es\/analisis-de-software\/ejercicios-corregidos-de-integridad-y-vistas-de-sql\/#Exercice-1\" >Exercice 1<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/complex-systems-ai.com\/es\/analisis-de-software\/ejercicios-corregidos-de-integridad-y-vistas-de-sql\/#Exercice-2\" >Exercice 2<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/complex-systems-ai.com\/es\/analisis-de-software\/ejercicios-corregidos-de-integridad-y-vistas-de-sql\/#Exercice-3\" >Exercice 3<\/a><\/li><\/ul><\/nav><\/div>\n<h2 class=\"elementor-heading-title elementor-size-default\"><span class=\"ez-toc-section\" id=\"Exercices-Corriges-en-SQL-Integrite-vues-et-confidentialite\"><\/span>Exercices Corrig\u00e9s en SQL - Int\u00e9grit\u00e9, vues et confidentialit\u00e9<span class=\"ez-toc-section-end\"><\/span><\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-eadc884 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"eadc884\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-ba28450\" data-id=\"ba28450\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-a499c32 elementor-widget elementor-widget-text-editor\" data-id=\"a499c32\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>SQL sur l&rsquo;int\u00e9grit\u00e9, les vues et la confidentialit\u00e9, chaque exercice corrig\u00e9s explore un de ces concepts.<\/p><p><img decoding=\"async\" class=\"wp-image-11096 size-full aligncenter\" src=\"http:\/\/complex-systems-ai.com\/wp-content\/uploads\/2020\/09\/cropped-Capture.png\" alt=\"vues\" width=\"97\" height=\"97\" title=\"\"><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-b62b0d6 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"b62b0d6\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-7dec298\" data-id=\"7dec298\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-6ce5e97 elementor-widget elementor-widget-heading\" data-id=\"6ce5e97\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\"><span class=\"ez-toc-section\" id=\"Enonce\"><\/span>Enonc\u00e9<span class=\"ez-toc-section-end\"><\/span><\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-da176c6 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"da176c6\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-b122bdd\" data-id=\"b122bdd\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-6dd4865 elementor-widget elementor-widget-text-editor\" data-id=\"6dd4865\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>L&rsquo;exemple utilis\u00e9 est celui d&rsquo;une base de donn\u00e9es \u00ab\u00a0biblioth\u00e8que\u00a0\u00bb g\u00e9rant des lecteurs, des livres identifi\u00e9s par un num\u00e9ro et appartenant \u00e0 une certaine cat\u00e9gorie d&rsquo;ouvrages (roman policier, roman d&rsquo;aventures, etc.) et les pr\u00eats des livres.<\/p><p>LIVRE(C<u>ote<\/u>,Titre,Auteur,Cat\u00e9gorie)<\/p><p>LECTEUR(<u>Num\u00e9ro<\/u>,Nom,Adresse,Consommation)<\/p><p>PRET(<u>Cote,NumLecteur,DateEmprunt<\/u>,DateRetour,DateRelance)<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-4e24117 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"4e24117\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-19cd939\" data-id=\"19cd939\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-ac36880 elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"ac36880\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-ad2bb19 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"ad2bb19\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-dbfbdf7\" data-id=\"dbfbdf7\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-465be83 elementor-widget elementor-widget-heading\" data-id=\"465be83\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\"><span class=\"ez-toc-section\" id=\"Exercice-1\"><\/span>Exercice 1<span class=\"ez-toc-section-end\"><\/span><\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-b372dd1 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"b372dd1\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-276aafd\" data-id=\"276aafd\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-b060f19 elementor-widget elementor-widget-text-editor\" data-id=\"b060f19\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>D\u00e9finir en SQL2 les contraintes d\u2019int\u00e9grit\u00e9 suivantes\u00a0:<\/p><ol><li>\u00a0La consommation d\u2019un lecteur est Forte, Moyenne ou Faible (contrainte de domaine)<\/li><li>\u00a0Tout pr\u00eat doit \u00eatre fait \u00e0 un lecteur existant dans la base, concernant un livre existant (contrainte r\u00e9f\u00e9rentielle)<\/li><li>\u00a0Chaque auteur ne peut \u00eatre class\u00e9 que dans une seule cat\u00e9gorie (d\u00e9p. fonctionnelle : auteur \u00e0 cat\u00e9gorie).<\/li><\/ol>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-37cda6a elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"37cda6a\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-0b74ddd\" data-id=\"0b74ddd\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-c1e18cc elementor-widget elementor-widget-toggle\" data-id=\"c1e18cc\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"toggle.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-toggle\">\n\t\t\t\t\t\t\t<div class=\"elementor-toggle-item\">\n\t\t\t\t\t<div id=\"elementor-tab-title-2031\" class=\"elementor-tab-title\" data-tab=\"1\" role=\"button\" aria-controls=\"elementor-tab-content-2031\" aria-expanded=\"false\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon elementor-toggle-icon-left\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon-closed\"><i class=\"fas fa-caret-right\"><\/i><\/span>\n\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon-opened\"><i class=\"elementor-toggle-icon-opened fas fa-caret-up\"><\/i><\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-toggle-title\" tabindex=\"0\">Solution<\/a>\n\t\t\t\t\t<\/div>\n\n\t\t\t\t\t<div id=\"elementor-tab-content-2031\" class=\"elementor-tab-content elementor-clearfix\" data-tab=\"1\" role=\"region\" aria-labelledby=\"elementor-tab-title-2031\"><ol><li>\u00a0ALTER TABLE Lecteur ADD (CONSTRAINT domaine_conso CHECK (Consommation IN (\u2018Forte\u2019, \u2018Moyenne\u2019, \u2018Faible\u2019)));<\/li><li>\u00a0ALTER TABLE Emprunt ADD (CONSTRAINT fk_lecteur FOREYGN KEY NumLecteur REFERENCES Lecteur); ALTER TABLE Emprunt ADD (CONSTRAINT fk_livre FOREYGN KEY Cote REFERENCES Livre);<\/li><li>\u00a0ALTER TABLE Livre ADD (CONSTRAINT auteur_cat\u00e9gorie CHECK (NOT EXISTS (SELECT Auteur FROM Livre GROUP BY Auteur HAVING COUNT(Cat\u00e9gorie) &gt; 1)));<\/li><\/ol><\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-83f9b24 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"83f9b24\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-80e61e2\" data-id=\"80e61e2\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-c5b2a16 elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"c5b2a16\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-8178990 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"8178990\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-9142eba\" data-id=\"9142eba\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-8e82db6 elementor-widget elementor-widget-heading\" data-id=\"8e82db6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\"><span class=\"ez-toc-section\" id=\"Exercice-2\"><\/span>Exercice 2<span class=\"ez-toc-section-end\"><\/span><\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-28d7407 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"28d7407\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-2a4a953\" data-id=\"2a4a953\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-6d21b60 elementor-widget elementor-widget-text-editor\" data-id=\"6d21b60\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><strong>Question 1<\/strong>: D\u00e9finition d&rsquo;une vue<\/p><p>Donnez les commandes SQL permettant de cr\u00e9er\u00a0 les vues suivantes :<\/p><p>a) les romans policiers, vue d\u00e9finie par le sch\u00e9ma suivant :<\/p><p>\u00a0\u00a0\u00a0\u00a0 POLICIER(Cote, Titre, Auteur)<\/p><p>b) les lecteurs de romans policiers, vue d\u00e9finie par le sch\u00e9ma suivant :<\/p><p>\u00a0 \u00a0 LECTEUR-DE-POLICIER(Num\u00e9ro,Nom,Adresse,Cote,DateEmprunt,DateRetour)<\/p><p>c) les lecteurs non autoris\u00e9s \u00e0 emprunter des livres dans le cas o\u00f9 ils ont oubli\u00e9 de rendre certains de leurs\u00a0emprunts pr\u00e9c\u00e9dents :\u00a0 \u00a0<\/p><p>\u00a0 \u00a0 \u00a0 LECTEUR-INTERDIT(Num\u00e9ro,Nom)<\/p><p>d) une relation STATS-DE-SPRETS d\u00e9crivant pour chaque lecteur le nombre de ses emprunts depuis la date <em>d<\/em>.<\/p><p><strong>Question 2<\/strong> Utilisation d&rsquo;une vue.<\/p><p>Un utilisateur ayant le droit d&rsquo;interroger \u00e0 partir des vues POLICIER et LECTEUR-DE-POLICIER pr\u00e9c\u00e9dentes pose les questions suivantes :<\/p><p>a) lister le nom des lecteurs qui ont emprunt\u00e9 des romans policiers \u00e0 la date <em>d<\/em>,<\/p><p>b) donner le nom des lecteurs ayant emprunt\u00e9 plus de trois romans policiers de Simenon le m\u00eame jour.<\/p><p>Exprimez ces questions en SQL sur les vues pr\u00e9c\u00e9dentes. Exprimez \u00e9galement ces questions sur les relations de base LECTEUR, LIVRE et PRET.<\/p><p><strong>Question 3<\/strong>: Traitement d&rsquo;une question portant sur une vue<\/p><p>Les vues d\u00e9finissent des relations virtuelles dont le contenu n&rsquo;est jamais effectivement calcul\u00e9. Lors de la cr\u00e9ation d&rsquo;une vue, seule la d\u00e9finition de la vue est stock\u00e9e dans une relation de la m\u00e9tabase. Quand un utilisateur pose une question sur une vue, le SGBD transforme celle-ci en une question portant sur les relations correspondantes de la base.<\/p><p>Cette transformation est faite soit directement sur la formulation en LMD de la requ\u00eate [Stonebraker75], soit en modifiant l&rsquo;arbre syntaxique alg\u00e9brique de la question [Astrahan76]. Dans les deux cas, la transformation consiste \u00e0 faire un ET entre la question de l&rsquo;utilisateur et les questions de d\u00e9finition des vues.<\/p><p>D\u00e9crivez l&rsquo;algorithme g\u00e9n\u00e9ral permettant de transformer une question pos\u00e9e sur des vues en une question exprim\u00e9e sur la base par modification de l&rsquo;arbre syntaxique de la question. Montrer son fonctionnement sur la question 2.b.<\/p><p><strong>Question 4<\/strong>: Mise \u00e0 jour \u00e0 travers une vue.<\/p><p>Les mises \u00e0 jour \u00e0 travers les vues posent diff\u00e9rents probl\u00e8mes suivant la d\u00e9finition de la vue: valeurs ind\u00e9finies (par exemple insertion d&rsquo;un nouveau tuple dans LECTEUR-INTERDIT), incoh\u00e9rences potentielles (par exemple insertion ou suppression d&rsquo;un tuple de LECTEUR-DE-POLICIER), non-d\u00e9finition de la mise \u00e0 jour (par exemple suppression d&rsquo;un tuple dans STATS-DES-PRETS du lecteur n\u00b0 1347).\u00a0<\/p><p>A quel type de d\u00e9finition de vue correspond chacun de ces probl\u00e8mes ? A quelle condition une mise \u00e0 jour sur une vue peut-elle \u00eatre r\u00e9percut\u00e9e sur la base sans ambigu\u00eft\u00e9?<\/p><p><strong>Question 5<\/strong>: Vues concr\u00e8tes ou clich\u00e9s<\/p><p>Certains SGBD proposent, outre le m\u00e9canisme des vues, la notion de <em>clich\u00e9<\/em> ou <em>vue concr\u00e8te <\/em>[Adiba 80] ou vue mat\u00e9rialis\u00e9e. Par opposition \u00e0 une vue, le contenu d&rsquo;une vue mat\u00e9rialis\u00e9e est calcul\u00e9 \u00e0 sa d\u00e9finition et stock\u00e9 dans la base de donn\u00e9es. Une vue mat\u00e9rialis\u00e9e refl\u00e8te l&rsquo;\u00e9tat de la base \u00e0 l&rsquo;instant <em>t<\/em>\u00a0 o\u00f9 elle a \u00e9t\u00e9 calcul\u00e9e.\u00a0<\/p><p>On appelle plus particuli\u00e8rement clich\u00e9 une vue concr\u00e8te qui est recalcul\u00e9e p\u00e9riodiquement par le syst\u00e8me. Les mises \u00e0 jour dans la base de donn\u00e9es doivent \u00eatre refl\u00e9t\u00e9es dans le clich\u00e9 lors de son rafra\u00eechissement. Comment peut-on \u00e9viter de recalculer syst\u00e9matiquement tout le clich\u00e9 \u00e0 chaque rafra\u00eechissement?<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-7ded948 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"7ded948\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-2615b01\" data-id=\"2615b01\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-f5b474f elementor-widget elementor-widget-toggle\" data-id=\"f5b474f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"toggle.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-toggle\">\n\t\t\t\t\t\t\t<div class=\"elementor-toggle-item\">\n\t\t\t\t\t<div id=\"elementor-tab-title-2571\" class=\"elementor-tab-title\" data-tab=\"1\" role=\"button\" aria-controls=\"elementor-tab-content-2571\" aria-expanded=\"false\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon elementor-toggle-icon-left\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon-closed\"><i class=\"fas fa-caret-right\"><\/i><\/span>\n\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon-opened\"><i class=\"elementor-toggle-icon-opened fas fa-caret-up\"><\/i><\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-toggle-title\" tabindex=\"0\">Solution<\/a>\n\t\t\t\t\t<\/div>\n\n\t\t\t\t\t<div id=\"elementor-tab-content-2571\" class=\"elementor-tab-content elementor-clearfix\" data-tab=\"1\" role=\"region\" aria-labelledby=\"elementor-tab-title-2571\"><p><strong>a) D\u00e9finition de la vue POLICIER<\/strong><\/p><p><strong>create view<\/strong> POLICIER<\/p><p><strong>as<\/strong> <strong>select<\/strong> Cote, Titre, Auteur<\/p><p><strong>from<\/strong> LIVRE<\/p><p><strong>where<\/strong> Cat\u00e9gorie = \u00ab\u00a0roman policier\u00a0\u00bb;<\/p><p>Cette vue est un exemple d&rsquo;une d\u00e9finition de sch\u00e9ma externe o\u00f9 le sous-ensemble de la base de donn\u00e9es est d\u00e9fini comme un sous-ensemble au niveau des occurrences.<\/p><p><strong>b) D\u00e9finition de la vue LECTEUR-DE-POLICIER<\/strong><\/p><p><strong>create view<\/strong> LECTEUR-DE-POLICIER<\/p><p><strong>as select<\/strong> Num\u00e9ro, Nom, Adresse, Cote, DateEmprunt, DateRetour<\/p><p><strong> from<\/strong> LIVRE L, LECTEUR E, PRET P<\/p><p><strong>where<\/strong> L.Cote = P.Cote <strong>and<\/strong> E.Num\u00e9ro = P.NumLecteur \u00a0\u00a0<strong>and<\/strong> L.Cat\u00e9gorie = \u00ab\u00a0roman policier\u00a0\u00bb;<\/p><p>Cette d\u00e9finition de vue est un exemple de restructuration de l&rsquo;information. L&rsquo;utilisateur ne voit dans la vue qu&rsquo;une seule relation alors qu&rsquo;en r\u00e9alit\u00e9 la base est compos\u00e9e de trois relations. Cette possibilit\u00e9 permet de simplifier le travail des utilisateurs en leur pr\u00e9sentant les informations sous le format qui leur convient le mieux, en leur \u00e9vitant par exemple la formulation de jointures lors d&rsquo;interrogations de la vue.<\/p><p><strong>c) D\u00e9finition de la vue LECTEUR-INTERDIT<\/strong><\/p><p><strong>create view<\/strong> LECTEUR-INTERDIT(Num\u00e9ro,Nom)<\/p><p><strong>as select<\/strong> Num\u00e9ro, Nom<\/p><p><strong>from<\/strong> LECTEUR E, PRET P<\/p><p><strong>where<\/strong> E.Num\u00e9ro = P.NumLecteur<\/p><p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>and<\/strong> (DateEmprunt + 15) &lt; DateSyst\u00e8me<\/p><p><strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 and<\/strong> DateRetour is NULL;<\/p><p>On suppose que le syst\u00e8me permet d&rsquo;obtenir la date du jour en utilisant le mot-cl\u00e9 \u00ab\u00a0date-syst\u00e8me\u00a0\u00bb. La d\u00e9finition de la vue est dynamique, en ce sens que son contenu varie tous les jours automatiquement en fonction de la date. Cette d\u00e9finition de vue permet \u00e9galement de changer les noms des attributs pour s&rsquo;adapter aux habitudes des utilisateurs.<\/p><p><strong>d) D\u00e9finition de la vue STATS-DES-PRETS<\/strong><\/p><p><strong>create view<\/strong> STATS-DES-PRETS(NumLecteur,NombrePr\u00eats,Nom)<\/p><p><strong>as select<\/strong> Num\u00e9ro, <strong>count<\/strong>(*)<\/p><p><strong>from<\/strong> LECTEUR E, PRET P<\/p><p><strong>where<\/strong> E.Num\u00e9ro = P.Numlecteur<\/p><p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>and<\/strong> DateEmprunt &gt; \u00ab\u00a0d\u00a0\u00bb<\/p><p><strong>group by<\/strong> NumLecteur;<\/p><p>L&rsquo;attribut NombrePr\u00eats est une information d\u00e9duite dans la mesure o\u00f9 elle n&rsquo;est pas stock\u00e9e en tant que telle dans la base de donn\u00e9es, mais calcul\u00e9e \u00e0 partir des informations stock\u00e9es.<\/p><p><strong>Question 2 :<\/strong> Utilisation d&rsquo;une vue<\/p><p><strong>a) La question utilisateur est <\/strong><\/p><p><strong>select distinct<\/strong> Nom<\/p><p><strong>from<\/strong> LECTEUR-DE-POLICIER<\/p><p><strong>where<\/strong> DateEmprunt = \u00ab\u00a0d\u00a0\u00bb;<\/p><p>La m\u00eame question pos\u00e9e sur les relations de la base serait:<\/p><p><strong>select<\/strong> Nom<\/p><p><strong>from<\/strong> LIVRE L, LECTEUR E, PRET P<\/p><p><strong>where<\/strong> L.Cote = P.Cote<\/p><p><strong>and<\/strong> E.Num\u00e9ro=P.Numlecteur<\/p><p><strong>and<\/strong> L.Cat\u00e9gorie = \u00ab\u00a0roman policier\u00a0\u00bb<\/p><p><strong>and<\/strong> DateEmprunt = \u00ab\u00a0d\u00a0\u00bb;<\/p><p>Cette question est beaucoup plus complexe \u00e0 formuler car elle comporte deux jointures, alors que la question sur la vue est tr\u00e8s simple puisqu&rsquo;elle ne comporte qu&rsquo;une restriction. C&rsquo;est l&rsquo;un des avantages des vues : simplifier le travail des utilisateurs.<\/p><p><strong>b) La question de l&rsquo;utilisateur exprim\u00e9e en SQL est la suivante:<\/strong><\/p><p><strong>select<\/strong> <strong>distinct<\/strong> Nom<\/p><p><strong>from<\/strong> LECTEUR-DE-POLICIER E, POLICIER P<\/p><p><strong>where<\/strong> E.Cote = P.Cote <strong>and<\/strong> Auteur = \u00ab\u00a0SIMENON\u00a0\u00bb<\/p><p><strong>group<\/strong> <strong>by<\/strong> NumLecteur, DateEmprunt<\/p><p><strong>having<\/strong> <strong>count<\/strong> (Numlivre)&gt;3;<\/p><p>La question telle qu&rsquo;elle aurait d\u00fb \u00eatre pos\u00e9e sur la base de donn\u00e9es est la suivante:<\/p><p><strong>select<\/strong> <strong>distinct<\/strong> Nom<\/p><p><strong>from<\/strong> LECTEUR E, LIVRE L, PRET P<\/p><p><strong>where<\/strong> P.Cote=L.Cote and Auteur=\u00a0\u00bbSimenon\u00a0\u00bb\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u00a0<\/p><p><strong> and<\/strong> L.Cat\u00e9gorie=\u00a0\u00bbroman policier\u00a0\u00bb\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/p><p><strong>and<\/strong> P.NumLecteur=E.Num\u00e9ro<\/p><p><strong>group<\/strong> <strong>by<\/strong> NumLecteur, DateEmprunt<\/p><p><strong>having<\/strong> <strong>count<\/strong> (Numlivre) &gt; 3;<\/p><p><strong>Question 3:<\/strong> Traitement d&rsquo;une question portant sur une vue<\/p><p>L&rsquo;algorithme de transformation d&rsquo;une question pos\u00e9e sur une ou plusieurs vues consiste \u00e0 \u00ab\u00a0additionner\u00a0\u00bb la question utilisateur et les questions d\u00e9finissant chacune des vues. Le traitement est it\u00e9ratif car une vue peut \u00eatre construite sur d&rsquo;autres vues.<\/p><p><strong>Tant que<\/strong> la question comporte l&rsquo;utilisation de vues<\/p><ul><li>rechercher dans la m\u00e9tabase les arbres de d\u00e9finition des vues<\/li><li>construire l&rsquo;arbre syntaxique de la question pos\u00e9e<\/li><li>changer les noms des attributs de la vue dans les noms d&rsquo;attributs correspondants s&rsquo;il y a re-nomination des attributs dans la vue<\/li><li>transformer les arbres en un seul en faisant co\u00efncider le r\u00e9sultat d&rsquo;une vue avec le nom de la vue dans la question<\/li><li>simplifier \u00e9ventuellement l&rsquo;arbre en \u00e9liminant les op\u00e9rations redondantes<\/li><\/ul><p><strong>ftq<\/strong><\/p><p>Passer l&rsquo;arbre transform\u00e9 de la question \u00e0 l&rsquo;optimiseur de question<\/p><p>Application de l&rsquo;algorithme sur l&rsquo;exemple :<\/p><p>1) L&rsquo;arbre de la question est le suivant :<\/p><p><img fetchpriority=\"high\" decoding=\"async\" class=\"alignnone wp-image-20030 size-full\" src=\"http:\/\/complex-systems-ai.com\/wp-content\/uploads\/2024\/02\/bdd37.png\" alt=\"sql vues\" width=\"430\" height=\"278\" title=\"\" srcset=\"https:\/\/complex-systems-ai.com\/wp-content\/uploads\/2024\/02\/bdd37.png 430w, https:\/\/complex-systems-ai.com\/wp-content\/uploads\/2024\/02\/bdd37-300x194.png 300w, https:\/\/complex-systems-ai.com\/wp-content\/uploads\/2024\/02\/bdd37-18x12.png 18w\" sizes=\"(max-width: 430px) 100vw, 430px\" \/><\/p><p>2) Les arbres des deux vues sont les suivants :<\/p><p><img decoding=\"async\" class=\"alignnone wp-image-20031 size-full\" src=\"http:\/\/complex-systems-ai.com\/wp-content\/uploads\/2024\/02\/bdd38.png\" alt=\"sql vues\" width=\"427\" height=\"305\" title=\"\" srcset=\"https:\/\/complex-systems-ai.com\/wp-content\/uploads\/2024\/02\/bdd38.png 427w, https:\/\/complex-systems-ai.com\/wp-content\/uploads\/2024\/02\/bdd38-300x214.png 300w, https:\/\/complex-systems-ai.com\/wp-content\/uploads\/2024\/02\/bdd38-18x12.png 18w, https:\/\/complex-systems-ai.com\/wp-content\/uploads\/2024\/02\/bdd38-120x85.png 120w\" sizes=\"(max-width: 427px) 100vw, 427px\" \/><\/p><p>3) Ajout des arbres en faisant co\u00efncider le r\u00e9sultat d&rsquo;une vue et le nom de la vue :<\/p><p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-20032 size-full\" src=\"http:\/\/complex-systems-ai.com\/wp-content\/uploads\/2024\/02\/bdd39.png\" alt=\"sql vues\" width=\"494\" height=\"565\" title=\"\" srcset=\"https:\/\/complex-systems-ai.com\/wp-content\/uploads\/2024\/02\/bdd39.png 494w, https:\/\/complex-systems-ai.com\/wp-content\/uploads\/2024\/02\/bdd39-262x300.png 262w, https:\/\/complex-systems-ai.com\/wp-content\/uploads\/2024\/02\/bdd39-10x12.png 10w\" sizes=\"(max-width: 494px) 100vw, 494px\" \/><\/p><p>4) Dans la d\u00e9finition des vues il n&rsquo;y a pas de renomination des attributs.<\/p><p>5) Simplification de l&rsquo;arbre.<\/p><p>On utilise deux fois la relation LIVRE pour une jointure sur n\u00b0livre. Il y a \u00e9galement deux restrictions identiques avec le crit\u00e8re &lt;cat\u00e9gorie = \u00ab\u00a0roman policier\u00a0\u00bb&gt;. On ne garde qu&rsquo;une fois chacune de ces op\u00e9rations.<\/p><p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-20033 size-full\" src=\"http:\/\/complex-systems-ai.com\/wp-content\/uploads\/2024\/02\/bdd40.png\" alt=\"sql vues\" width=\"331\" height=\"291\" title=\"\" srcset=\"https:\/\/complex-systems-ai.com\/wp-content\/uploads\/2024\/02\/bdd40.png 331w, https:\/\/complex-systems-ai.com\/wp-content\/uploads\/2024\/02\/bdd40-300x264.png 300w, https:\/\/complex-systems-ai.com\/wp-content\/uploads\/2024\/02\/bdd40-14x12.png 14w\" sizes=\"(max-width: 331px) 100vw, 331px\" \/><\/p><p><strong>Question 4<\/strong>: Mise \u00e0 jour \u00e0 travers une vue<\/p><p>La mise \u00e0 jour \u00e0 travers les vues est interdite dans le cas g\u00e9n\u00e9ral car elle pose diff\u00e9rents probl\u00e8mes :<\/p><p>(1) \u00a0\u00a0\u00a0\u00a0\u00a0 Attributs non d\u00e9finis dans la vue: toute insertion d&rsquo;un tuple dans la vue entra\u00eene l&rsquo;insertion d&rsquo;un tuple dans la base ayant une valeur ind\u00e9termin\u00e9e pour les attributs non visibles dans la vue. Par exemple l&rsquo;insertion d&rsquo;un nouveau tuple dans la vue LECTEUR-INTERDIT implique l&rsquo;insertion d&rsquo;un tuple LECTEUR dont l&rsquo;adresse est inconnue. Toute vue incluant dans sa d\u00e9finition une projection entra\u00eene ce type de probl\u00e8me.<\/p><p>(2) \u00a0\u00a0\u00a0\u00a0\u00a0 Risques d&rsquo;incoh\u00e9rence quand une relation d&rsquo;une vue est obtenue par jointure de plusieurs relations r\u00e9elles. Par exemple, l&rsquo;insertion d&rsquo;un tuple dans LECTEUR-DE-POLICIER signifie-t-elle l&rsquo;ajout d&rsquo;un pr\u00eat pour un lecteur existant, ou l&rsquo;insertion d&rsquo;un pr\u00eat et d&rsquo;un nouveau lecteur, ou encore l&rsquo;insertion d&rsquo;un pr\u00eat, d&rsquo;un livre et d&rsquo;un lecteur ?\u00a0<\/p><p>L&rsquo;ambigu\u00eft\u00e9 est la m\u00eame pour les suppressions de tuples.\u00a0 La r\u00e9percussion d&rsquo;une mise \u00e0 jour d\u00e9pend de la s\u00e9mantique de la vue et de l&rsquo;application. Elle ne peut pas \u00eatre automatique. Il faudrait d\u00e9crire pour chaque vue la s\u00e9mantique des op\u00e9rations de mises \u00e0 jour.<\/p><p>(3) \u00a0\u00a0\u00a0\u00a0\u00a0 Perte de signification de la mise \u00e0 jour: la suppression, par exemple, du tuple (1347, 45) de la vue STATS-DES-PRETS, ne peut pas \u00eatre r\u00e9percut\u00e9e au niveau des relations de la base. Cette perte de signification est caract\u00e9ristique des vues construites en utilisant des agr\u00e9gats et\/ou des fonctions de calcul somme ou moyenne.<\/p><p>En g\u00e9n\u00e9ral les SGBD interdisent les mises \u00e0 jour \u00e0 travers les vues. Certains les autorisent dans le cas o\u00f9 la s\u00e9mantique des mises \u00e0 jour peut \u00eatre d\u00e9finie sans ambigu\u00eft\u00e9. C&rsquo;est le cas si la d\u00e9finition de la vue n&rsquo;utilise que l&rsquo;op\u00e9rateur de restriction d&rsquo;une relation (ni jointure, ni projection, ni agr\u00e9gat, ni fonction de calcul).\u00a0<\/p><p>Dans ce cas un tuple de la vue correspond \u00e0 un seul tuple de la base. On peut autoriser \u00e9galement l&rsquo;op\u00e9rateur de projection si le SGBD g\u00e8re les valeurs ind\u00e9termin\u00e9es.<\/p><p><strong>Question 5<\/strong>: Vues concr\u00e8tes ou clich\u00e9s<\/p><p>Le temps de calcul et de stockage d&rsquo;un clich\u00e9 peut \u00eatre important si le sous-ensemble de la base de donn\u00e9es correspondant est volumineux. Pour r\u00e9duire ce temps d&rsquo;ex\u00e9cution, qui pour un clich\u00e9 est r\u00e9p\u00e9titif, le syst\u00e8me peut utiliser un m\u00e9canisme de mise \u00e0 jour diff\u00e9rentiel. Seuls les tuples ins\u00e9r\u00e9s, supprim\u00e9s ou modifi\u00e9s dans la base depuis le dernier calcul sont \u00e0 leur tour ins\u00e9r\u00e9s, supprim\u00e9s ou modifi\u00e9s dans le clich\u00e9.<\/p><p>Il est n\u00e9cessaire que le SGBD garde les tuples ins\u00e9r\u00e9s ou supprim\u00e9s des relations de la base dans une relation sp\u00e9ciale. Les suppressions de tuples posent un probl\u00e8me particulier dans le cas g\u00e9n\u00e9ral : un tuple du clich\u00e9 peut provenir de plusieurs tuples de la base et la suppression d&rsquo;un seul de ces tuples ne doit pas entra\u00eener la suppression du tuple du clich\u00e9.\u00a0<\/p><p>Ce probl\u00e8me est \u00e9tudi\u00e9 dans [Kerherv\u00e9 86]. L&rsquo;id\u00e9e est d&rsquo;associer \u00e0 chaque tuple de la vue un compteur indiquant le nombre de raisons pour sa pr\u00e9sence. Lors d&rsquo;une suppression d&rsquo;un tuple de la base le compteur correspondant est d\u00e9cr\u00e9ment\u00e9. Quand le compteur devient nul, le tuple du clich\u00e9 est supprim\u00e9.<\/p><\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-a5f5081 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"a5f5081\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-a737def\" data-id=\"a737def\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-6908b3b elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"6908b3b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-434d5c4 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"434d5c4\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-100b68b\" data-id=\"100b68b\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-b1f51ed elementor-widget elementor-widget-heading\" data-id=\"b1f51ed\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\"><span class=\"ez-toc-section\" id=\"Exercice-3\"><\/span>Exercice 3<span class=\"ez-toc-section-end\"><\/span><\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-411afe7 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"411afe7\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-fed6b4e\" data-id=\"fed6b4e\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-b5654da elementor-widget elementor-widget-text-editor\" data-id=\"b5654da\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><strong>Question 1<\/strong>: Exemple d&rsquo;utilisation<\/p><p>Ecrire la commande permettant de transmettre les droits de lecture et insertion sur la relation LIVRE \u00e0 l&rsquo;usager Dupont, en lui garantissant le droit de transmettre ses droits.<\/p><p>\u00a0<strong>Question 2<\/strong>: V\u00e9rification de l&rsquo;attribution des droits<\/p><p>D\u00e9crivez les principes de l&rsquo;algorithme d&rsquo;octroi de droit (GRANT). Les renseignements concernant la gestion des autorisations sont m\u00e9moris\u00e9s dans une relation syst\u00e8me de la m\u00e9tabase appel\u00e9e DROIT. Sp\u00e9cifier le sch\u00e9ma de cette relation en fonction de l&rsquo;algorithme de GRANT.<\/p><p>\u00a0<strong>Question 3<\/strong>: V\u00e9rification du retrait d&rsquo;un droit<\/p><p>Dans un syst\u00e8me d\u00e9centralis\u00e9, la proc\u00e9dure de retrait des droits est d\u00e9licate. Il faut en effet retirer le droit \u00e0 l&rsquo;usager indiqu\u00e9, mais aussi le retirer r\u00e9cursivement \u00e0 tous les usagers auxquels celui-ci l&rsquo;avait transmis. D&rsquo;autre part, un usager peut recevoir un m\u00eame droit de plusieurs donateurs diff\u00e9rents. Quand l&rsquo;un d&rsquo;entre eux le lui retire, il conserve celui provenant de sources diff\u00e9rentes. Sp\u00e9cifier les principes de l&rsquo;algorithme de REVOKE. Indiquer les modifications \u00e9ventuelles du sch\u00e9ma de la relation DROIT.<\/p><p><strong>Question 4<\/strong>: V\u00e9rification des droits d&rsquo;acc\u00e8s lors des manipulations<\/p><p>La v\u00e9rification qu&rsquo;un usager a le droit de r\u00e9aliser une certaine op\u00e9ration sur une relation doit \u00eatre ex\u00e9cut\u00e9e rapidement. Comment le syst\u00e8me peut-il r\u00e9pondre \u00e0 cette contrainte?<\/p><p><strong>Question 5<\/strong>: Droits sur une vue<\/p><p>Quand un utilisateur cr\u00e9e une vue, quels sont les droits qui lui sont automatiquement attribu\u00e9s sur la relation virtuelle ?<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-464f36d elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"464f36d\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-922a609\" data-id=\"922a609\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-f801478 elementor-widget elementor-widget-toggle\" data-id=\"f801478\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"toggle.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-toggle\">\n\t\t\t\t\t\t\t<div class=\"elementor-toggle-item\">\n\t\t\t\t\t<div id=\"elementor-tab-title-2601\" class=\"elementor-tab-title\" data-tab=\"1\" role=\"button\" aria-controls=\"elementor-tab-content-2601\" aria-expanded=\"false\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon elementor-toggle-icon-left\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon-closed\"><i class=\"fas fa-caret-right\"><\/i><\/span>\n\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon-opened\"><i class=\"elementor-toggle-icon-opened fas fa-caret-up\"><\/i><\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-toggle-title\" tabindex=\"0\">Solution<\/a>\n\t\t\t\t\t<\/div>\n\n\t\t\t\t\t<div id=\"elementor-tab-content-2601\" class=\"elementor-tab-content elementor-clearfix\" data-tab=\"1\" role=\"region\" aria-labelledby=\"elementor-tab-title-2601\"><p><strong>Question 1<\/strong>: Exemple d&rsquo;utilisation<\/p><p><strong>grant<\/strong> <strong>select insert on<\/strong> LIVRE<\/p><p><strong>to<\/strong> dupont<\/p><p><strong>with<\/strong> <strong>grant option<\/strong><\/p><p>\u00a0<strong>Question 2<\/strong>: V\u00e9rification de l&rsquo;attribution des droits.<\/p><p>Une requ\u00eate GRANT a les param\u00e8tres suivants:<\/p><ol><li>l&rsquo;usager ayant \u00e9mis le GRANT, appel\u00e9 donateur;<\/li><li>l&rsquo;usager \u00e0 qui les droits sont accord\u00e9s, appel\u00e9 b\u00e9n\u00e9ficiaire;<\/li><li>la liste des droits accord\u00e9s (un droit \u00e9tant accord\u00e9 avec ou sans droit de transmission), chacune des deux possibilit\u00e9s est identifi\u00e9e comme un droit diff\u00e9rent;<\/li><li>la relation sur laquelle les droits sont accord\u00e9s appel\u00e9e objet.<\/li><\/ol><p>La relation DROIT permet de m\u00e9moriser ces informations. Son sch\u00e9ma peut \u00eatre le suivant :<\/p><p>DROIT(relation-objet,nom-b\u00e9n\u00e9ficiaire,nom-donateur,\u00a0\u00a0<\/p><p>droits-non-transmissibles,droits-transmissibles)<\/p><p>Ce sch\u00e9ma n&rsquo;est pas en premi\u00e8re forme normale car les attributs droits-transmissibles et droits-non-transmissibles contiennent plusieurs valeurs, mais il permet un stockage plus compact. Il n\u00e9cessite inversement un traitement pour analyser les droits pr\u00e9sents.<\/p><p>L&rsquo;algorithme de GRANT comprend les \u00e9tapes suivantes :<\/p><p>1) v\u00e9rifier que le donateur poss\u00e8de les droits qu&rsquo;il veut accorder avec le droit de transmission.<\/p><p>\u00a0\u00a0 Il faut pour cela extraire de la relation DROIT les droits que l&rsquo;auteur du GRANT poss\u00e8de sur la relation &lsquo;objet&rsquo;.<\/p><p>\u00a0\u00a0 <strong>select<\/strong> droits-transmissibles<\/p><p>\u00a0\u00a0 <strong>from<\/strong> droit<\/p><p>\u00a0\u00a0 <strong>where<\/strong> nom-b\u00e9n\u00e9ficiaire = \u00ab\u00a0donateur\u00a0\u00bb<\/p><p>\u00a0\u00a0\u00a0 <strong>and<\/strong> relation-objet = \u00ab\u00a0objet\u00a0\u00bb;<\/p><p>2) si le donateur poss\u00e8de effectivement le droit de transmettre &lsquo;liste-droits&rsquo;, ces derniers doivent \u00eatre m\u00e9moris\u00e9s dans la relation DROIT par une requ\u00eate INSERT, soit comme droits transmissibles soit comme droits non transmissibles suivant la pr\u00e9sence ou non de la clause <strong>with grant option<\/strong>.<\/p><p>\u00a0\u00a0 L&rsquo;algorithme de <strong>grant<\/strong> g\u00e9n\u00e9rera la requ\u00eate suivante:<\/p><p>\u00a0\u00a0 <strong>insert into<\/strong> DROIT<\/p><p><strong>values<\/strong>(\u00ab\u00a0objet\u00a0\u00bb,\u00a0\u00bbb\u00e9n\u00e9ficiaire\u00a0\u00bb,\u00a0\u00bbdonateur\u00a0\u00bb,nil,\u00a0\u00bbliste-droits\u00a0\u00bb)<\/p><p>\u00a0\u00a0 ou<\/p><p>\u00a0\u00a0 <strong>insert into<\/strong> DROIT<\/p><p><strong>values<\/strong>(\u00ab\u00a0objet\u00a0\u00bb,\u00a0\u00bbb\u00e9n\u00e9ficiaire\u00a0\u00bb,\u00a0\u00bbdonateur\u00a0\u00bb,\u00a0\u00bbliste-droits\u00a0\u00bb,nil)<\/p><p>\u00a0<strong>Question 3<\/strong>: V\u00e9rification du retrait d&rsquo;un droit<\/p><p>Dans un syst\u00e8me \u00e0 gestion des droits d\u00e9centralis\u00e9e o\u00f9 les droits sont accord\u00e9s, v\u00e9rifi\u00e9s et retir\u00e9s dynamiquement, le contr\u00f4le du retrait des droits n&rsquo;est pas trivial. La v\u00e9rification de la provenance des droits d&rsquo;un usager n\u00e9cessite en principe de tracer le <a href=\"https:\/\/complex-systems-ai.com\/es\/teoria-de-grafos\/\">graphe<\/a> de transmission des autorisations pour v\u00e9rifier la provenance de chaque droit et s&rsquo;assurer qu&rsquo;un usager ne s&rsquo;est pas retransmis un droit \u00e0 lui-m\u00eame par une voie d\u00e9tourn\u00e9e.\u00a0<\/p><p>Une solution plus simple que la construction du graphe a \u00e9t\u00e9 d\u00e9velopp\u00e9e dans [ Lindsay79]. On associe \u00e0 chaque droit une estampille indiquant la date \u00e0 laquelle le droit a \u00e9t\u00e9 accord\u00e9. L&rsquo;estampille permet de reconna\u00eetre les droits qui restent \u00e0 un usager X, quand un droit qui lui avait \u00e9t\u00e9 accord\u00e9 \u00e0 une date <em>t<\/em> dispara\u00eet. Tous les droits issus r\u00e9cursivement de X et post\u00e9rieurs \u00e0 <em>t<\/em> doivent \u00e9galement dispara\u00eetre. Le format de la relation DROIT devient le suivant:\u00a0<\/p><p>DROIT ( relation-objet,<\/p><p>nom-b\u00e9n\u00e9ficiaire,<\/p><p>nom-donateur,<\/p><p>droits-non-transmissibles,<\/p><p>estampilles-droits-transmissibles )<\/p><p>Chaque droit transmissible est repr\u00e9sent\u00e9, non plus par un bit mais par l&rsquo;heure \u00e0 laquelle il a \u00e9t\u00e9 accord\u00e9. Un droit non accord\u00e9 a une estampille 0. Un exemple du contenu de la relation (en ne consid\u00e9rant que les droits transmissibles) est le suivant :<\/p><table><tbody><tr><td width=\"56\"><p>relation objet<\/p><\/td><td width=\"84\"><p>nom b\u00e9n\u00e9ficiaire<\/p><\/td><td width=\"70\"><p>nom donateur<\/p><\/td><td width=\"70\"><p>select<\/p><\/td><td width=\"70\"><p>insert<\/p><\/td><td width=\"70\"><p>delete<\/p><\/td><td width=\"70\"><p>update<\/p><\/td><\/tr><tr><td width=\"56\"><p>LIVRE<\/p><\/td><td width=\"84\"><p>X<\/p><\/td><td width=\"70\"><p>A<\/p><\/td><td width=\"70\"><p>15<\/p><\/td><td width=\"70\"><p>15<\/p><\/td><td width=\"70\"><p>0<\/p><\/td><td width=\"70\"><p>0<\/p><\/td><\/tr><tr><td width=\"56\"><p>LIVRE<\/p><\/td><td width=\"84\"><p>X<\/p><\/td><td width=\"70\"><p>B<\/p><\/td><td width=\"70\"><p>20<\/p><\/td><td width=\"70\"><p>0<\/p><\/td><td width=\"70\"><p>20<\/p><\/td><td width=\"70\"><p>0<\/p><\/td><\/tr><tr><td width=\"56\"><p>LIVRE<\/p><\/td><td width=\"84\"><p>Y<\/p><\/td><td width=\"70\"><p>X<\/p><\/td><td width=\"70\"><p>25<\/p><\/td><td width=\"70\"><p>25<\/p><\/td><td width=\"70\"><p>25<\/p><\/td><td width=\"70\"><p>0<\/p><\/td><\/tr><tr><td width=\"56\"><p>LIVRE<\/p><\/td><td width=\"84\"><p>X<\/p><\/td><td width=\"70\"><p>C<\/p><\/td><td width=\"70\"><p>30<\/p><\/td><td width=\"70\"><p>0<\/p><\/td><td width=\"70\"><p>30<\/p><\/td><td width=\"70\"><p>0<\/p><\/td><\/tr><\/tbody><\/table><p>Supposons qu&rsquo;\u00e0 l&rsquo;instant t = 35, B retire tous les droits qu&rsquo;il avait accord\u00e9s \u00e0 X au temps t = 20. Le tuple (LIVRE, X, B, 20, 0, 20, 0) doit dispara\u00eetre. Les droits qui restent \u00e0 X sont alors (LIVRE, X, (A,C), (15, 30), 15, 30, 0). Les droits que X a transmis sont (LIVRE, Y, X, 25, 25, 25, 0).\u00a0<\/p><p>Le droit DELETE donn\u00e9 par X au temps t = 25 doit dispara\u00eetre puisque l&rsquo;on consid\u00e8re \u00e0 pr\u00e9sent\u00a0 que X a re\u00e7u ce droit au temps t = 30. En revanche les droits SELECT et INSERT accord\u00e9s \u00e0 Y au temps 25 sont conserv\u00e9s car ils proviennent de droits re\u00e7us par X avant le temps 20. L&rsquo;algorithme est le suivant :<\/p><p><strong>proc<\/strong> REVOKE (b: nom-b\u00e9n\u00e9ficiaire, da: droit-acc\u00e8s, r: relation-objet, d: nom-donateur)<\/p><p>\/* retirer le privil\u00e8ge &lsquo;da&rsquo; accord\u00e9 par &lsquo;d&rsquo; \u00e0 &lsquo;b&rsquo; sur &lsquo;r&rsquo; *\/<\/p><p><strong>update<\/strong> DROIT<\/p><p><strong>set<\/strong> da = 0<\/p><p><strong>where<\/strong> nom-b\u00e9n\u00e9ficiare = b<\/p><p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>and<\/strong> nom-donateur = d<\/p><p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>and<\/strong> relation-objet = r;<\/p><p>\/* d\u00e9finir l&rsquo;estampille minimum qui reste \u00e0 &lsquo;b&rsquo; pour le droit &lsquo;da&rsquo; sur la relation &lsquo;r&rsquo; *\/<\/p><p><strong>select<\/strong> MIN(da) <strong>into<\/strong> min<\/p><p><strong>from<\/strong> DROIT<\/p><p><strong>where<\/strong> nom-b\u00e9n\u00e9ficiare = b<\/p><p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>and<\/strong> relation-objet = r;<\/p><p>\/* retirer tous les droits &lsquo;da&rsquo; accord\u00e9s par &lsquo;b&rsquo; sur &lsquo;r&rsquo; avant\u00a0 &lsquo;min&rsquo; *\/<\/p><p><strong>select<\/strong> nom-b\u00e9n\u00e9ficiaire <strong>into<\/strong> liste-retrait\u00a0\u00a0<\/p><p><strong>from<\/strong> DROIT<\/p><p><strong>where<\/strong> nom-donateur=&rsquo;b&rsquo;<\/p><p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>and<\/strong> relation-objet=&rsquo;r&rsquo;<\/p><p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>and<\/strong> da&lt;&lsquo;min&rsquo;;<\/p><p><strong>Si<\/strong> liste-retrait \u00ac vide<\/p><p><strong>alors<\/strong> <strong>pour chaque<\/strong> \u00e9l\u00e9ment &lsquo;l&rsquo; <strong>de<\/strong> liste-retrait<\/p><p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0<strong>faire<\/strong><\/p><p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 REVOKE (l, da, r, b)<\/p><p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0<strong>fpour<\/strong><\/p><p><strong> fsi <\/strong><\/p><p><strong>fin proc<\/strong>\u00a0<\/p><p>L&rsquo;algorithme est <a href=\"https:\/\/complex-systems-ai.com\/es\/algoritmico\/programacion-recursiva\/\">r\u00e9cursif<\/a> et retire de proche en proche les droits \u00e0 tous ceux auxquels il ne peut plus avoir \u00e9t\u00e9 accord\u00e9.\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/p><p>\u00a0Exemple :<\/p><p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-20034\" src=\"http:\/\/complex-systems-ai.com\/wp-content\/uploads\/2024\/02\/bdd41.png\" alt=\"sql droits\" width=\"222\" height=\"136\" title=\"\" srcset=\"https:\/\/complex-systems-ai.com\/wp-content\/uploads\/2024\/02\/bdd41.png 222w, https:\/\/complex-systems-ai.com\/wp-content\/uploads\/2024\/02\/bdd41-18x12.png 18w\" sizes=\"(max-width: 222px) 100vw, 222px\" \/><\/p><p>Si A retire son droit \u00e0 X, il faut r\u00e9cursivement l&rsquo;enlever \u00e0 tous les autres. L&rsquo;algorithme se d\u00e9roule ainsi:<\/p><ul><li>1\u00e8repasse : REVOKE (X, da, r, A)<\/li><\/ul><p>\u00a0\u00a0 retire \u00e0 X le droit &lsquo;da&rsquo; qui lui vient de A<\/p><p>\u00a0\u00a0 minimum des estampilles qui restent \u00e0 X: 15<\/p><p>\u00a0\u00a0 ==&gt; retirer le droit \u00e0 Y donn\u00e9 en t = 10 (donc avant 15) : REVOKE (Y, da, r, Y)<\/p><ul><li>2\u00e8mepasse : REVOKE (Y, da, r, X)<\/li><\/ul><p>\u00a0\u00a0 Y n&rsquo; a plus le droit &lsquo;da&rsquo;, donc il faut retirer ce droit \u00e0 ceux auxquels il l&rsquo;a transmis :<\/p><p>\u00a0\u00a0 REVOKE (X, da, r, Y)<\/p><ul><li>3\u00e8mepasse : REVOKE (X, da, r, Y)<\/li><\/ul><p>\u00a0\u00a0 X n&rsquo;a plus le droit &lsquo;da&rsquo;, il faut donc le retirer \u00e0 ceux auxquels il l&rsquo;a transmis:<\/p><p>\u00a0\u00a0 REVOKE (Z, da, r, X)<\/p><p><strong>Question 4<\/strong>: V\u00e9rification des droits d&rsquo;acc\u00e8s lors des manipulations<\/p><p>Lors de chaque requ\u00eate d&rsquo;un utilisateur le syst\u00e8me v\u00e9rifie que cet usager a effectivement le droit d&rsquo;ex\u00e9cuter ce type de requ\u00eate sur les relations cit\u00e9es. Cette v\u00e9rification pourrait se faire par un acc\u00e8s \u00e0 la relation DROIT, mais cet acc\u00e8s g\u00e9n\u00e8re alors une entr\u00e9e-sortie par requ\u00eate ce qui est lourd.\u00a0<\/p><p>Une meilleure solution consiste \u00e0 n&rsquo;acc\u00e9der \u00e0 la relation DROIT qu&rsquo;une fois en d\u00e9but de session pour chaque utilisateur. Quand un utilisateur se connecte au SGBD, apr\u00e8s son authentification (v\u00e9rification qu&rsquo;il a bien le droit d&rsquo;utiliser le SGBD), le syst\u00e8me lit en m\u00e9moire centrale la partie de la relation DROIT qui le concerne. Cet extrait de la relation DROIT pour un usager &lsquo;U&rsquo; est d\u00e9fini par:<\/p><p><strong>select<\/strong> * <strong>into<\/strong> DROITS-MC<\/p><p><strong>from<\/strong> DROIT<\/p><p><strong>where<\/strong> nom-b\u00e9n\u00e9ficiaire = &lsquo;U&rsquo;;<\/p><p>La relation DROITS-MC doit \u00eatre stock\u00e9e en m\u00e9moire centrale dans un emplacement r\u00e9serv\u00e9 au syst\u00e8me auquel un utilisateur ne peut jamais avoir acc\u00e8s pour \u00e9viter toute modification frauduleuse ou accidentelle de cette relation.<\/p><p><strong>Question 5<\/strong>: Droits d&rsquo;acc\u00e8s sur une vue<\/p><p>Quand un utilisateur cr\u00e9e une vue,\u00a0 il ne peut obtenir sur celle-ci des droits sup\u00e9rieurs \u00e0 ceux qu&rsquo;il a sur les relations de la base servant \u00e0 construire la vue. Les droits qui sont accord\u00e9s automatiquement au cr\u00e9ateur d&rsquo;une vue sont \u00e9gaux \u00e0 l&rsquo;ensemble des droits que l&rsquo;usager poss\u00e8de sur chacune des relations composant la vue.<\/p><p>Les droits acquis sur la vue ne sont transmissibles que s&rsquo;ils l&rsquo;\u00e9taient pour les relations de la base. Pour cr\u00e9er la vue, l&rsquo;utilisateur doit avoir le droit de lecture (select) sur les relations servant \u00e0 composer la vue. Il aura donc au minimum un droit de lecture sur la vue cr\u00e9\u00e9e.<\/p><\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>P\u00e1gina de inicio de an\u00e1lisis de software Wiki Ejercicios respondidos en SQL - Integridad, vistas y confidencialidad SQL sobre integridad, vistas y confidencialidad, cada ejercicio corregido... <\/p>","protected":false},"author":1,"featured_media":0,"parent":4609,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-20024","page","type-page","status-publish","hentry"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/complex-systems-ai.com\/es\/wp-json\/wp\/v2\/pages\/20024","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/complex-systems-ai.com\/es\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/complex-systems-ai.com\/es\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/complex-systems-ai.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/complex-systems-ai.com\/es\/wp-json\/wp\/v2\/comments?post=20024"}],"version-history":[{"count":22,"href":"https:\/\/complex-systems-ai.com\/es\/wp-json\/wp\/v2\/pages\/20024\/revisions"}],"predecessor-version":[{"id":20517,"href":"https:\/\/complex-systems-ai.com\/es\/wp-json\/wp\/v2\/pages\/20024\/revisions\/20517"}],"up":[{"embeddable":true,"href":"https:\/\/complex-systems-ai.com\/es\/wp-json\/wp\/v2\/pages\/4609"}],"wp:attachment":[{"href":"https:\/\/complex-systems-ai.com\/es\/wp-json\/wp\/v2\/media?parent=20024"}],"curies":[{"name":"gracias","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}