<?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[MijaDev]]></title><description><![CDATA[MijaDev]]></description><link>https://mijadev.hashnode.dev</link><generator>RSS for Node</generator><lastBuildDate>Sat, 12 Sep 2026 06:43:55 GMT</lastBuildDate><atom:link href="https://mijadev.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[¿Qué es un Database Link (DBLINK) en Oracle y cómo se utiliza?]]></title><description><![CDATA[📌 Introducción
En entornos donde existen varias bases de datos Oracle distribuidas, a veces es necesario consultar datos que se encuentran en otra instancia sin mover información manualmente.Para esto, Oracle ofrece una funcionalidad poderosa llamad...]]></description><link>https://mijadev.hashnode.dev/que-es-un-database-link-dblink-en-oracle-y-como-se-utiliza</link><guid isPermaLink="true">https://mijadev.hashnode.dev/que-es-un-database-link-dblink-en-oracle-y-como-se-utiliza</guid><category><![CDATA[Oracle]]></category><category><![CDATA[SQL]]></category><category><![CDATA[SqlDeveloper]]></category><category><![CDATA[Databases]]></category><category><![CDATA[data]]></category><category><![CDATA[APEX Insights]]></category><dc:creator><![CDATA[Mijail Dias Bengoa]]></dc:creator><pubDate>Thu, 11 Dec 2025 23:20:48 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/GSiEeoHcNTQ/upload/dcb0d96aa2311f5f5e832eb20ac00c16.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="heading-introduccion">📌 Introducción</h2>
<p>En entornos donde existen varias bases de datos Oracle distribuidas, a veces es necesario consultar datos que se encuentran en otra instancia sin mover información manualmente.<br />Para esto, Oracle ofrece una funcionalidad poderosa llamada <strong>Database Link (DBLINK)</strong>.</p>
<p>Un DBLINK permite que una base de datos <em>A</em> se conecte directamente a una base de datos <em>B</em>, como si estuvieran en la misma instancia. Es una herramienta clave para integraciones, migraciones, ETLs, sincronización y consultas distribuidas.</p>
<hr />
<h1 id="heading-que-es-un-database-link-en-oracle">🔗 <strong>¿Qué es un Database Link en Oracle?</strong></h1>
<p>Un <strong>database link</strong> es un <strong>objeto de base de datos</strong> que almacena información de conexión hacia otra base de datos Oracle.</p>
<p>👉 Significa que desde tu base <strong>puedes ejecutar consultas, inserts, updates o deletes directamente en otra base</strong>, usando SQL.</p>
<p>Ejemplo simple:</p>
<pre><code class="lang-sql"><span class="hljs-keyword">SELECT</span> * <span class="hljs-keyword">FROM</span> clientes@DB_LINK_REMOTO;
</code></pre>
<hr />
<h1 id="heading-que-contiene-un-dblink">🧩 ¿Qué contiene un DBLINK?</h1>
<p>Un DBLINK almacena:</p>
<ul>
<li><p>El <strong>usuario remoto</strong></p>
</li>
<li><p>La <strong>contraseña del usuario remoto</strong></p>
</li>
<li><p>El <strong>TNS o servicio de conexión</strong> hacia la otra base</p>
</li>
</ul>
<p>Todo esto registrado en el data dictionary.</p>
<hr />
<h1 id="heading-tipos-de-database-link">🏗 Tipos de Database Link</h1>
<h3 id="heading-1-private-database-link"><strong>1. Private Database Link</strong></h3>
<ul>
<li><p>Lo crea un usuario</p>
</li>
<li><p>Solo ese usuario puede usarlo</p>
</li>
</ul>
<pre><code class="lang-sql"><span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">DATABASE</span> <span class="hljs-keyword">LINK</span> mi_link
<span class="hljs-keyword">CONNECT</span> <span class="hljs-keyword">TO</span> remoto_user <span class="hljs-keyword">IDENTIFIED</span> <span class="hljs-keyword">BY</span> remoto_pass
<span class="hljs-keyword">USING</span> <span class="hljs-string">'REMOTEDB'</span>;
</code></pre>
<hr />
<h3 id="heading-2-public-database-link"><strong>2. Public Database Link</strong></h3>
<ul>
<li><p>Lo puede usar cualquier usuario</p>
</li>
<li><p>Lo crea el usuario SYS</p>
</li>
</ul>
<pre><code class="lang-sql"><span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">PUBLIC</span> <span class="hljs-keyword">DATABASE</span> <span class="hljs-keyword">LINK</span> mi_link_publico
<span class="hljs-keyword">CONNECT</span> <span class="hljs-keyword">TO</span> remoto_user <span class="hljs-keyword">IDENTIFIED</span> <span class="hljs-keyword">BY</span> remoto_pass
<span class="hljs-keyword">USING</span> <span class="hljs-string">'REMOTEDB'</span>;
</code></pre>
<hr />
<h3 id="heading-3-fixed-user-link"><strong>3. Fixed User Link</strong></h3>
<p>Siempre usa <strong>el mismo usuario remoto</strong>, sin importar quién ejecute la consulta.</p>
<hr />
<h3 id="heading-4-current-user-link"><strong>4. Current User Link</strong></h3>
<p>Cuando se usa <strong>autenticación externa</strong>.</p>
<hr />
<h1 id="heading-como-crear-un-database-link">⚙️ ¿Cómo crear un Database Link?</h1>
<p>Antes, define la conexión remota en <code>tnsnames.ora</code>:</p>
<pre><code class="lang-sql">REMOTEDB =
  (DESCRIPTION=
    (ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.50)(PORT=1521))
    (CONNECT_DATA=(SERVICE_NAME=ORCL))
  )
</code></pre>
<p>Luego crea el link:</p>
<pre><code class="lang-sql"><span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">DATABASE</span> <span class="hljs-keyword">LINK</span> remoto_link
<span class="hljs-keyword">CONNECT</span> <span class="hljs-keyword">TO</span> hr <span class="hljs-keyword">IDENTIFIED</span> <span class="hljs-keyword">BY</span> hr
<span class="hljs-keyword">USING</span> <span class="hljs-string">'REMOTEDB'</span>;
</code></pre>
<hr />
<h1 id="heading-consultar-datos-por-dblink">📥 Consultar datos por DBLINK</h1>
<pre><code class="lang-sql"><span class="hljs-keyword">SELECT</span> nombre, correo 
<span class="hljs-keyword">FROM</span> usuarios@remoto_link;
</code></pre>
<p>Oracle envía la consulta a la otra base y te devuelve los datos.</p>
<hr />
<h1 id="heading-insertar-datos-en-la-base-remota">📤 Insertar datos en la base remota</h1>
<pre><code class="lang-sql"><span class="hljs-keyword">INSERT</span> <span class="hljs-keyword">INTO</span> clientes@remoto_link (<span class="hljs-keyword">id</span>, nombre, telefono)
<span class="hljs-keyword">VALUES</span> (<span class="hljs-number">101</span>, <span class="hljs-string">'Carlos López'</span>, <span class="hljs-string">'4558-9982'</span>);
</code></pre>
<hr />
<h1 id="heading-actualizar-datos-remotos">🔄 Actualizar datos remotos</h1>
<pre><code class="lang-sql"><span class="hljs-keyword">UPDATE</span> productos@remoto_link
<span class="hljs-keyword">SET</span> precio = <span class="hljs-number">25.99</span>
<span class="hljs-keyword">WHERE</span> id_producto = <span class="hljs-number">50</span>;
</code></pre>
<hr />
<h1 id="heading-eliminar-un-database-link">🧹 Eliminar un Database Link</h1>
<pre><code class="lang-sql"><span class="hljs-keyword">DROP</span> <span class="hljs-keyword">DATABASE</span> <span class="hljs-keyword">LINK</span> remoto_link;
</code></pre>
<p>Para links públicos:</p>
<pre><code class="lang-sql"><span class="hljs-keyword">DROP</span> <span class="hljs-keyword">PUBLIC</span> <span class="hljs-keyword">DATABASE</span> <span class="hljs-keyword">LINK</span> remoto_link;
</code></pre>
<hr />
<h1 id="heading-como-ver-los-dblinks-existentes">🔎 <strong>Cómo ver los DBLINKs existentes</strong></h1>
<p>Privados:</p>
<pre><code class="lang-sql"><span class="hljs-keyword">SELECT</span> db_link, host, username <span class="hljs-keyword">FROM</span> user_db_links;
</code></pre>
<p>Públicos:</p>
<pre><code class="lang-sql"><span class="hljs-keyword">SELECT</span> * <span class="hljs-keyword">FROM</span> dba_db_links;
</code></pre>
<hr />
<h1 id="heading-buenas-practicas-al-usar-dblinks">⚠️ Buenas prácticas al usar DBLINKs</h1>
<p>✔ No usar usuarios SYS o SYSTEM en DBLINK<br />✔ Usar usuarios específicos y con roles mínimos<br />✔ Usar TNS entries y no IPs directas<br />✔ No dejar passwords débiles en DBLINK<br />✔ Si es posible, usar <strong>passwordless authentication con wallets</strong><br />✔ Evitar transacciones distribuidas innecesarias<br />✔ Monitorear rendimiento (DBLINK introduce latencia)</p>
<hr />
<h1 id="heading-conclusion">🧠 Conclusión</h1>
<p>Los <strong>Database Links</strong> son una herramienta esencial en Oracle para conectar bases de datos entre sí. Facilitan integraciones, migraciones y consultas distribuidas sin tener que mover los datos manualmente.<br />Con una buena configuración y buenas prácticas de seguridad, un DBLINK es un recurso muy potente para cualquier arquitecto o desarrollador de Oracle.</p>
]]></content:encoded></item><item><title><![CDATA[Cómo crear usuarios, roles y privilegios en Oracle (Guía práctica)]]></title><description><![CDATA[✔ Introducción
La administración de usuarios, roles y privilegios es una de las tareas más importantes para cualquier DBA o desarrollador que trabaje con Oracle Database. En esta guía aprenderás, paso a paso, cómo:

Crear usuarios

Crear roles person...]]></description><link>https://mijadev.hashnode.dev/como-crear-usuarios-roles-y-privilegios-en-oracle-guia-practica</link><guid isPermaLink="true">https://mijadev.hashnode.dev/como-crear-usuarios-roles-y-privilegios-en-oracle-guia-practica</guid><category><![CDATA[Oracle]]></category><category><![CDATA[SQL]]></category><category><![CDATA[SqlDeveloper]]></category><category><![CDATA[Oracle Database]]></category><dc:creator><![CDATA[Mijail Dias Bengoa]]></dc:creator><pubDate>Tue, 25 Nov 2025 17:16:38 GMT</pubDate><content:encoded><![CDATA[<h2 id="heading-introduccion">✔ <strong>Introducción</strong></h2>
<p>La administración de usuarios, roles y privilegios es una de las tareas más importantes para cualquier DBA o desarrollador que trabaje con Oracle Database. En esta guía aprenderás, paso a paso, cómo:</p>
<ul>
<li><p>Crear usuarios</p>
</li>
<li><p>Crear roles personalizados</p>
</li>
<li><p>Asignar privilegios del sistema y de objetos</p>
</li>
<li><p>Validar los permisos</p>
</li>
<li><p>Resolver errores comunes (como ORA-01031 u ORA-65096)</p>
</li>
</ul>
<p>Todo funciona tanto en <strong>CDB/PDB</strong> como en instalaciones standalone.</p>
<hr />
<h2 id="heading-requisitos">✔ <strong>Requisitos</strong></h2>
<ul>
<li><p>Tener acceso a un usuario con privilegios administrativos (como <code>SYS</code>, <code>SYSTEM</code> o un DBA).</p>
</li>
<li><p>Estar conectado a la <strong>PDB correcta</strong> si usas una base multitenant.<br />  Para verificar la sesión:</p>
</li>
</ul>
<pre><code class="lang-plaintext">SHOW CON_NAME;
</code></pre>
<p>Para cambiar de PDB:</p>
<pre><code class="lang-plaintext">ALTER SESSION SET CONTAINER = nombre_pdb;
</code></pre>
<hr />
<h1 id="heading-1-crear-un-usuario-en-oracle">🟦 <strong>1. Crear un usuario en Oracle</strong></h1>
<p>Para crear un usuario necesitas:</p>
<ul>
<li><p>Nombre del usuario</p>
</li>
<li><p>Contraseña</p>
</li>
<li><p>Tablespace por defecto</p>
</li>
</ul>
<h3 id="heading-ejemplo-basico">📌 <strong>Ejemplo básico</strong></h3>
<pre><code class="lang-plaintext">CREATE USER mijail IDENTIFIED BY admin
DEFAULT TABLESPACE users
TEMPORARY TABLESPACE temp
QUOTA UNLIMITED ON users;
</code></pre>
<h3 id="heading-explicacion-rapida">Explicación rápida:</h3>
<ul>
<li><p><code>CREATE USER</code> → crea la cuenta.</p>
</li>
<li><p><code>QUOTA</code> → cuánto espacio puede usar ese usuario.</p>
</li>
</ul>
<hr />
<h1 id="heading-2-asignar-privilegios-al-usuario">🟦 <strong>2. Asignar privilegios al usuario</strong></h1>
<p>Oracle requiere que un usuario tenga ciertos permisos para poder conectarse.</p>
<h3 id="heading-privilegios-minimos-para-conectarse">✔ <strong>Privilegios mínimos para conectarse</strong></h3>
<pre><code class="lang-plaintext">GRANT CREATE SESSION TO mijail;
</code></pre>
<h3 id="heading-privilegios-para-crear-objetos">✔ <strong>Privilegios para crear objetos</strong></h3>
<pre><code class="lang-plaintext">GRANT CREATE TABLE TO mijail;
GRANT CREATE VIEW TO mijail;
GRANT CREATE SEQUENCE TO mijail;
GRANT CREATE PROCEDURE TO mijail;
</code></pre>
<h3 id="heading-dar-permisos-sobre-objetos-existentes">✔ <strong>Dar permisos sobre objetos existentes</strong></h3>
<p>Por ejemplo, darle acceso a una tabla:</p>
<pre><code class="lang-plaintext">GRANT SELECT, INSERT, UPDATE ON ventas TO mijail;
</code></pre>
<hr />
<h1 id="heading-3-crear-un-rol-personalizado">🟦 <strong>3. Crear un rol personalizado</strong></h1>
<p>Los roles permiten agrupar privilegios y administrarlos más fácilmente.</p>
<h3 id="heading-crear-un-rol">📌 <strong>Crear un rol</strong></h3>
<pre><code class="lang-plaintext">CREATE ROLE rol_gestor;
</code></pre>
<h3 id="heading-asignar-privilegios-al-rol">📌 <strong>Asignar privilegios al rol</strong></h3>
<pre><code class="lang-plaintext">GRANT CREATE SESSION TO rol_gestor;
GRANT CREATE TABLE TO rol_gestor;
GRANT SELECT, INSERT ON clientes TO rol_gestor;
</code></pre>
<h3 id="heading-asignar-el-rol-al-usuario">📌 <strong>Asignar el rol al usuario</strong></h3>
<pre><code class="lang-plaintext">GRANT rol_gestor TO mijail;
</code></pre>
<p>Ahora el usuario tiene todos los permisos del rol.</p>
<hr />
<h1 id="heading-4-validar-permisos-asignados">🟦 <strong>4. Validar permisos asignados</strong></h1>
<h3 id="heading-ver-roles-del-usuario">✔ Ver roles del usuario</h3>
<pre><code class="lang-plaintext">SELECT * FROM dba_role_privs WHERE grantee = 'MIJAIL';
</code></pre>
<h3 id="heading-ver-privilegios-de-sistema">✔ Ver privilegios de sistema</h3>
<pre><code class="lang-plaintext">SELECT * FROM dba_sys_privs WHERE grantee = 'MIJAIL';
</code></pre>
<h3 id="heading-ver-privilegios-sobre-objetos">✔ Ver privilegios sobre objetos</h3>
<pre><code class="lang-plaintext">SELECT * FROM dba_tab_privs WHERE grantee = 'MIJAIL';
</code></pre>
<hr />
<h1 id="heading-5-errores-comunes-y-como-solucionarlos">🟥 <strong>5. Errores comunes y cómo solucionarlos</strong></h1>
<h2 id="heading-ora-65096-invalid-common-user-or-role-name">❌ <strong>ORA-65096: invalid common user or role name</strong></h2>
<p>Ocurre cuando intentas crear un usuario común en una PDB.</p>
<h3 id="heading-solucion">✔ Solución:</h3>
<p>Asegúrate de estar dentro de la <strong>PDB</strong>, no en la CDB:</p>
<pre><code class="lang-plaintext">ALTER SESSION SET CONTAINER = mi_pdb;
</code></pre>
<p>Luego crea el usuario normalmente.</p>
<hr />
<h2 id="heading-ora-01031-insufficient-privileges">❌ <strong>ORA-01031: insufficient privileges</strong></h2>
<p>Ocurre cuando el usuario que crea otros usuarios <strong>no tiene permisos suficientes</strong>.</p>
<h3 id="heading-solucion-1">✔ Solución:</h3>
<p>Conectarse como SYS o asignar:</p>
<pre><code class="lang-plaintext">GRANT CREATE USER, ALTER USER, DROP USER TO system;
GRANT DBA TO system;
</code></pre>
<hr />
<h2 id="heading-ora-01917-user-or-role-does-not-exist">❌ <strong>ORA-01917: user or role does not exist</strong></h2>
<p>El nombre no existe o faltan comillas.</p>
<pre><code class="lang-plaintext">SELECT username FROM dba_users;
</code></pre>
<hr />
<h1 id="heading-6-buenas-practicas-recomendadas">🟦 <strong>6. Buenas prácticas recomendadas</strong></h1>
<p>✔ No usar el usuario SYSTEM para trabajar día a día.<br />✔ Crear roles por área (ej: ROL_APEX, ROL_REPORTES, ROL_INVENTARIOS).<br />✔ Asignar permisos directamente a roles, no a usuarios.<br />✔ Controlar cuotas en tablespaces.<br />✔ Usar contraseñas seguras.</p>
<hr />
<h1 id="heading-conclusion">🟩 <strong>Conclusión</strong></h1>
<p>Con esta guía ya puedes administrar usuarios, roles y privilegios en Oracle de forma correcta y profesional. Este conocimiento es clave para manejar seguridad, acceso y organización dentro de cualquier base de datos empresarial.</p>
]]></content:encoded></item></channel></rss>