<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[CodeIvoire]]></title><description><![CDATA[CodeIvoire]]></description><link>https://codeivoire.hashnode.dev</link><generator>RSS for Node</generator><lastBuildDate>Tue, 10 Nov 2026 14:03:24 GMT</lastBuildDate><atom:link href="https://codeivoire.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Comment vérifier et définir la taille maximale du stockage Pluggable Databse (PDB)]]></title><description><![CDATA[Vous pouvez spécifier la taille maximale pour n’importe quelle base de données PDB en utilisant la clause STORAGE de la commande CREATE PLUGGABLE DATABASE…]]></description><link>https://codeivoire.hashnode.dev/comment-verifier-et-definir-la-taille-maximale-du-stockage-pluggable-databse-pdb</link><guid isPermaLink="true">https://codeivoire.hashnode.dev/comment-verifier-et-definir-la-taille-maximale-du-stockage-pluggable-databse-pdb</guid><category><![CDATA[SQL]]></category><category><![CDATA[Oracle]]></category><category><![CDATA[Databases]]></category><dc:creator><![CDATA[Soulemane Konate]]></dc:creator><pubDate>Thu, 16 Feb 2023 09:45:02 GMT</pubDate><content:encoded><![CDATA[<p>Vous pouvez spécifier la taille maximale pour n’importe quelle base de données PDB en utilisant la clause STORAGE de la commande CREATE PLUGGABLE DATABASE. Le PDB peut être un PDB traditionnel, un conteneur d’application ou un PDB d’application.</p>
<p>Pour utiliser cette commande, les conditions suivantes doivent respectées:</p>
<ul>
<li><p>Vous devez être connecté à un conteneur de Database (CDB). Le CDB doit être ouverte et en mode READ WRITE.</p>
</li>
<li><p>Pour créer un PDB ou un conteneur d’application, le conteneur courant doit être la racine (root) et vous devez avoir le privilège système CREATE PLUGGABLE DATABASE.</p>
</li>
</ul>
<p>Pour modifier la taille allouée, utiliser l’instruction ALTER PLUGGABLE DATABASE pour modifier une base de données pluggable (PDB).</p>
<ol>
<li><p>Exécutez sql dans le PDB actuel pour limiter la taille de tous les fichiers de données de ce PDB :</p>
<pre><code class="lang-sql"> <span class="hljs-keyword">ALTER</span> <span class="hljs-keyword">PLUGGABLE</span> <span class="hljs-keyword">DATABASE</span> pdb_name <span class="hljs-keyword">STORAGE</span> (<span class="hljs-keyword">MAXSIZE</span> [taille]);
 or 
 <span class="hljs-keyword">ALTER</span> <span class="hljs-keyword">PLUGGABLE</span> <span class="hljs-keyword">DATABASE</span> pdb_name <span class="hljs-keyword">STORAGE</span> <span class="hljs-keyword">UNLIMITED</span>;
</code></pre>
<p> Taille: Vous permet de spécifier un nombre d’octets, de kilooctets (K), de mégaoctets (M), de gigaoctets (G), de téraoctets (T), de pétaoctets (P) ou d’exaoctets (E) dans toute instruction qui vous permet d’établir des quantités d’espace disque ou mémoire.</p>
<p> La clause UNLIMITED vous permet de ne pas definir de taille limite du PDB.</p>
</li>
<li><p>Pour vérifier le réglage, exécuter la procédure ci-dessous dans le PDB actuel</p>
<pre><code class="lang-sql"> <span class="hljs-keyword">select</span> PROPERTY_VALUE <span class="hljs-keyword">FROM</span> database_properties <span class="hljs-keyword">WHERE</span> property_name = <span class="hljs-string">'MAX_PDB_STORAGE'</span>;
</code></pre>
</li>
</ol>
]]></content:encoded></item><item><title><![CDATA[Reconstruire ou réorganiser un index sous  Oracle]]></title><description><![CDATA[Sous Oracle, au fil du temps, les « index » deviennent fragmentés et causent de graves problèmes de performance. La fragmentation de l’index se produit…]]></description><link>https://codeivoire.hashnode.dev/reconstruire-ou-reorganiser-un-index-sous-oracle</link><guid isPermaLink="true">https://codeivoire.hashnode.dev/reconstruire-ou-reorganiser-un-index-sous-oracle</guid><category><![CDATA[Oracle]]></category><category><![CDATA[performance]]></category><dc:creator><![CDATA[Soulemane Konate]]></dc:creator><pubDate>Mon, 23 Jan 2023 12:17:42 GMT</pubDate><content:encoded><![CDATA[<p>Sous Oracle, au fil du temps, les « index » deviennent fragmentés et causent de graves problèmes de performance. La fragmentation de l’index se produit lorsqu’une mise à jour ou une suppression massive d’enregistrements se produit sur les tables. Par conséquent, si une sélection de toutes les lignes se produit sur une table avec un index fragmenté et que les résultats sont classés par la colonne indexée, la base de données lira principalement des blocs de feuilles « leaf blocks» d’index vides qui auront une incidence sur la performance de la requête</p>
<p>De ce fait, Il faut vérifier les index régulièrement et les reconstruire ou les fusionner si nécessaire. La question alors de la réorganisation ou la reconstruction se pose. reconstruire ou réorganiser?</p>
<h3 id="heading-reorganisation-dindex">Réorganisation d’index</h3>
<p>La réorganisation d’un index permet de conserver l’espace alloué à l’index ; il ne renvoie pas l’espace inutilisé à la base de données.</p>
<p>La commande COALESCE indique à la base de données de combiner le contenu des blocs d’index pour libérer des blocs pour une utilisation future, si possible.</p>
<pre><code class="lang-sql"><span class="hljs-keyword">ALTER</span> <span class="hljs-keyword">INDEX</span> &lt;nom_de_lindex&gt; <span class="hljs-keyword">COALESCE</span>;
<span class="hljs-keyword">ALTER</span> <span class="hljs-keyword">INDEX</span> &lt;nom_de_lindex&gt; <span class="hljs-keyword">COALESCE</span> <span class="hljs-keyword">CLEANUP</span>; <span class="hljs-comment">-- If Orphaned index entries exists.</span>
</code></pre>
<h3 id="heading-reconstruire-un-index">Reconstruire un index</h3>
<p>Vous pouvez choisir de reconstruire un index pour libérer de l’espace pour la base de données. le processus de reconstruction de l'index est plus couteux en matière d'espace utilisé, de temps de traitement (CPU) que le processus de réorgainsation.</p>
<pre><code class="lang-sql"><span class="hljs-keyword">ALTER</span> <span class="hljs-keyword">INDEX</span> &lt;nom_de_lindex&gt; <span class="hljs-keyword">REBUILD</span>; <span class="hljs-comment">-- faster but put locks on the table.</span>
<span class="hljs-keyword">ALTER</span> <span class="hljs-keyword">INDEX</span> &lt;nom_de_lindex&gt; <span class="hljs-keyword">REBUILD</span> <span class="hljs-keyword">ONLINE</span>;
</code></pre>
<h3 id="heading-ma-reccomendation">Ma reccomendation</h3>
<p>Essayez de réorganiser l'index comme première option. Si l’espace alloué doit être libéré vers la base de données, alors reconstruisez l’index</p>
]]></content:encoded></item><item><title><![CDATA[Conseils gratuits sur  les "unusable index" dans les bases oracle.]]></title><description><![CDATA[Comment détecter et restaurer les index inutilisables.]]></description><link>https://codeivoire.hashnode.dev/conseils-gratuits-sur-les-unusable-index-dans-les-bases-oracle</link><guid isPermaLink="true">https://codeivoire.hashnode.dev/conseils-gratuits-sur-les-unusable-index-dans-les-bases-oracle</guid><category><![CDATA[dabase]]></category><category><![CDATA[Oracle]]></category><category><![CDATA[SQL]]></category><dc:creator><![CDATA[Soulemane Konate]]></dc:creator><pubDate>Fri, 30 Dec 2022 11:19:37 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1673605269813/bdf8cc9a-351d-471b-b0b9-9dd20e91e5b8.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="heading-introduction">Introduction</h2>
<p>Lors d'une journée de travail tranquille, j'ai été contacté par un développeur qui reçu le message d'erreur : "ORA-14063 : un index inutilisable existe sur une clé de contrainte unique/primaire".</p>
<p>Pour débuter mon investigation, J'ai interrogé la table ALL_INDEXES et l'état de l'index était « UNUSABLE ». J'ai également remarqué que l'index était assigné à un tablespace (TS) nommé "MAINTENANCE" (ce TS est souvent utilisé par les DBA/développeurs à mon lieu de travail) pour la maintenance des objets de la base.</p>
<p>Je concluais donc qu'une opération de maintenance etait en cours. De ce fait, je patiente... Une fois ces tâches terminées, l'index était redevenu “VALID” valide.</p>
<p>Cet article sur les ‘UNUSABLE’ index devrait vous aider à:</p>
<ul>
<li><p>En savoir plus sur les index inutilisables</p>
</li>
<li><p>retrouver les index 'UNUSABLE' inutilisables</p>
</li>
<li><p>résoudre les index inutilisables.</p>
</li>
</ul>
<h2 id="heading-la-circonstance">La circonstance</h2>
<p>Les opérations de maintenance suivantes rendront une partition d'index inutilisable:</p>
<ol>
<li><p>IMPORT de PARTITION ou chemin conventionnel SQL*Loader.</p>
</li>
<li><p>"direct Path" avec SQL*Loader laisse les partitions d'index local et les index globaux concernés dans un état inutilisable, s'il ne se termine pas correctement.</p>
</li>
<li><p>Opérations de maintenance de partitions telles que ALTER TABLE MOVE|TRUNCATE|SPLIT PARTITION.</p>
</li>
<li><p>Opérations de maintenance d'index comme ALTER INDEX SPLIT PARTITION.</p>
</li>
<li><p>Ajout d'une partition à une table partitionnée par hachage - Hash Partition.</p>
</li>
<li><p>Vous pouvez aussi choisir de rendre l'index 'UNUSABLE' avec la commande ALTER INDEX.</p>
</li>
</ol>
<pre><code class="lang-sql">SQL&gt; <span class="hljs-keyword">ALTER</span> <span class="hljs-keyword">INDEX</span> mon_index <span class="hljs-keyword">UNUSABLE</span>;
Index Altered
</code></pre>
<p>Pour rendre un index partitioné 'UNUSABLE'</p>
<pre><code class="lang-sql">SQL&gt; <span class="hljs-keyword">ALTER</span> <span class="hljs-keyword">INDEX</span> mon_index <span class="hljs-keyword">MODIFY</span> <span class="hljs-keyword">PARTITION</span> mon_index_partition <span class="hljs-keyword">UNUSABLE</span>;
 Index altered.
</code></pre>
<h2 id="heading-la-detection">la détection</h2>
<p>Vous pouvez utiliser les commandes suivantes pour trouver les index inutilisables.</p>
<p>Tables sans partitions</p>
<pre><code class="lang-sql"><span class="hljs-comment">-- Table Sans partitions</span>
<span class="hljs-keyword">SELECT</span> owner, index_name, tablespace_name
<span class="hljs-keyword">FROM</span>   dba_indexes
<span class="hljs-keyword">WHERE</span>  <span class="hljs-keyword">status</span> = <span class="hljs-string">'UNUSABLE'</span>;

<span class="hljs-comment">--Index partitionés</span>
<span class="hljs-keyword">SELECT</span> index_owner, index_name, partition_name, tablespace_name
<span class="hljs-keyword">FROM</span>   dba_ind_PARTITIONS <span class="hljs-keyword">WHERE</span>  <span class="hljs-keyword">status</span> = <span class="hljs-string">'UNUSABLE'</span>;

<span class="hljs-comment">-- Index partitionés</span>
<span class="hljs-keyword">SELECT</span> index_owner, index_name, partition_name, subpartition_name, tablespace_name
<span class="hljs-keyword">FROM</span>   dba_ind_SUBPARTITIONS
<span class="hljs-keyword">WHERE</span>  <span class="hljs-keyword">status</span> = <span class="hljs-string">'UNUSABLE'</span>;
</code></pre>
<h2 id="heading-la-resolution">La résolution</h2>
<p>Ces scripts affichent la commande pour résourdre les index inutilisable.</p>
<pre><code class="lang-sql"><span class="hljs-comment">-- Index sans paritions</span>
<span class="hljs-keyword">SELECT</span> <span class="hljs-string">'alter index '</span>||owner||<span class="hljs-string">'.'</span>||index_name||<span class="hljs-string">' rebuild tablespace '</span>||tablespace_name ||<span class="hljs-string">' ONLINE PARALLEL;'</span> cmd_recreer_index  <span class="hljs-keyword">FROM</span>   dba_indexes <span class="hljs-keyword">WHERE</span>  <span class="hljs-keyword">status</span> = <span class="hljs-string">'UNUSABLE'</span>;

<span class="hljs-comment">-- Index avec partitions:</span>
<span class="hljs-keyword">SELECT</span> <span class="hljs-string">'alter index '</span>||index_owner||<span class="hljs-string">'.'</span>||index_name ||<span class="hljs-string">' rebuild partition '</span>||PARTITION_NAME||<span class="hljs-string">' TABLESPACE '</span>||tablespace_name ||<span class="hljs-string">' ONLINE PARALLEL;'</span> cmd_recreer_index  <span class="hljs-keyword">FROM</span>  dba_ind_partitions <span class="hljs-keyword">WHERE</span>  <span class="hljs-keyword">status</span> = <span class="hljs-string">'UNUSABLE'</span>;

<span class="hljs-comment">-- Index avec sous partitions:</span>
<span class="hljs-keyword">SELECT</span> <span class="hljs-string">'alter index '</span>||index_owner||<span class="hljs-string">'.'</span>||index_name ||<span class="hljs-string">' rebuild subpartition '</span>||SUBPARTITION_NAME||<span class="hljs-string">' TABLESPACE '</span>||tablespace_name ||<span class="hljs-string">' ONLINE PARALLEL;'</span> cmd_recreer_index <span class="hljs-keyword">FROM</span>   dba_ind_subpartitions <span class="hljs-keyword">WHERE</span>  <span class="hljs-keyword">status</span> = <span class="hljs-string">'UNUSABLE'</span>;
</code></pre>
<h2 id="heading-tips">Tips:</h2>
<p>Utilisez l'option 'NOLOGGING' pour reconstruire l'index plus rapidement. N'oubliez pas de définir l'index 'LOGGING' une fois l'opération de reconstruction terminée avec ALTER INDEX index_name LOGGING.</p>
<p>Modifiez la fonctionnalité des index inutilisables en définissant le paramètre d'initialisation SKIP_UNUSABLE_INDEXES à 'TRUE' ou 'FALSE' (défaut). Par exemple, lorsque la valeur est 'TRUE' , les mises à jour sur la table continuent sans erreures, mais les index inutilisables ne sont pas mis a jour.</p>
<p>Pour plus d'information sur the parametres SKIP_UNUSABLE_INDEXES:</p>
<p>SQL*Loader : <a target="_blank" href="https://docs.oracle.com/database/121/SUTIL/GUID-F1992092-32BE-462B-9E4E-271F571FCAC4.htm#SUTIL1045">Cliquez ici</a></p>
]]></content:encoded></item><item><title><![CDATA[Connaître la différence entre SELECT_CATALOG_ROLE et SELECT ANY DICTIONARY.]]></title><description><![CDATA[Cet article explique la différence subtile entre SELECT_CATALOG_ROLE et SELECT ANY DICTIONARY Le rôle SELECT_CATALOG_ROLE et le privilège SELECT ANY…]]></description><link>https://codeivoire.hashnode.dev/connaitre-la-difference-entre-selectcatalogrole-et-select-any-dictionary</link><guid isPermaLink="true">https://codeivoire.hashnode.dev/connaitre-la-difference-entre-selectcatalogrole-et-select-any-dictionary</guid><category><![CDATA[Oracle]]></category><category><![CDATA[SQL]]></category><category><![CDATA[PL/SQL]]></category><category><![CDATA[Tips for Developers]]></category><dc:creator><![CDATA[Soulemane Konate]]></dc:creator><pubDate>Mon, 12 Dec 2022 04:57:44 GMT</pubDate><content:encoded><![CDATA[<p>Cet article explique la différence subtile entre SELECT_CATALOG_ROLE et SELECT ANY DICTIONARY</p>
<h2 id="heading-definition">Définition</h2>
<p>Le rôle SELECT_CATALOG_ROLE et le privilège SELECT ANY DICTIONARY donnent tous deux accès aux tables du dictionnaire oracle DBA_% , et aux vues de performances V$_%.</p>
<ul>
<li><p>SELECT_CATALOG_ROLE comme son nom l'indique est un role oracle. Un role est une collection de system-level et object-level privilèges.</p>
</li>
<li><p>SELECT ANY DICTIONARY est un privilège système. Il permet entre autre au bénéficiaire de créer des tables.</p>
</li>
</ul>
<p>Vous devez être prudent lorsque vous attribuez le rôle ou le privilège car le bénéficiaire pourrais :</p>
<ul>
<li><p>Voir les objets appartenant à d'autres utilisateurs (schémas)</p>
</li>
<li><p>Voir le code source des objets appartenant à d'autres utilisateurs</p>
</li>
</ul>
<blockquote>
<p>Très peu d'utilisateurs devraient avoir accès à ces privilèges pour des raisons de sécurité. Cependant, dans un environnement de non-production, les développeurs peuvent trouver utile d'extraire le code source et d'afficher certaines données de performances.</p>
</blockquote>
<h3 id="heading-exemple">Exemple</h3>
<p>Supposons deux utilisateurs, schema_support et schema_code;</p>
<p>Connectez vous a la base en tant qu'administrateur:</p>
<pre><code class="lang-plaintext">C:\oracle\ sqlplus / as sysdba
</code></pre>
<p>Octroie des permissions</p>
<pre><code class="lang-sql">SQL&gt; <span class="hljs-keyword">grant</span> <span class="hljs-keyword">select</span> <span class="hljs-keyword">any</span> dictionary <span class="hljs-keyword">to</span> schema_support;
<span class="hljs-keyword">Grant</span> succeeded.

<span class="hljs-keyword">SQL</span>&gt; <span class="hljs-keyword">grant</span> select_catalog_role <span class="hljs-keyword">to</span> schema_code;
<span class="hljs-keyword">Grant</span> succeeded.
</code></pre>
<p>Et vous avez terminé !!!</p>
<p>Pour lister les objects du dictionnaire oracle dont vous avez accès avec le role SELECT_CATALOG_ROLE, exécuter la commande:</p>
<pre><code class="lang-sql">
<span class="hljs-keyword">select</span> privilege, <span class="hljs-keyword">type</span>, table_name <span class="hljs-keyword">from</span> dba_tab_privs <span class="hljs-keyword">where</span> grantee = <span class="hljs-string">'SELECT_CATALOG_ROLE'</span>  <span class="hljs-keyword">order</span> <span class="hljs-keyword">by</span> <span class="hljs-number">1</span>,<span class="hljs-number">2</span>,<span class="hljs-number">3</span>;
</code></pre>
<p>Pour lister les privilèges inclus dans 'SELECT ANY DICTIONARY', exécuter la commande:</p>
<pre><code class="lang-plaintext">C:\oracle\ sqlplus schema_support/pass123@locaholst:1523/xepdb1
Connected.

SQL&gt; select * from session_privs;

PRIVILEGE
----------------------------------------
CREATE SESSION
CREATE TABLE
CREATE CLUSTER
CREATE SYNONYM
CREATE VIEW
CREATE SEQUENCE
CREATE PROCEDURE
CREATE TRIGGER
CREATE MATERIALIZED VIEW
CREATE TYPE
CREATE OPERATOR
CREATE INDEXTYPE
CREATE DIMENSION
SELECT ANY DICTIONARY
CREATE JOB

15 rows selected.
</code></pre>
<p>l'utilisateur schema_code pourrais rencontrer des problèmes de compilation d'objects tel que vues, procédures stockées etc... s'il référence une table du dictionnaire ( je donnerai plus de détail sur ce sujet plus tard). Schema_support n'en aura aucun.</p>
]]></content:encoded></item></channel></rss>