├── .gitignore └── Notes ├── notes.md └── src ├── backup_1.jpg ├── backup_2.jpg ├── backup_3.jpg ├── backup_4.jpg ├── bd_proyecto.jpg ├── comandos_1.jpg ├── comandos_10.jpg ├── comandos_11.jpg ├── comandos_12.jpg ├── comandos_13.jpg ├── comandos_14.jpg ├── comandos_15.jpg ├── comandos_2.jpg ├── comandos_3.jpg ├── comandos_4.jpg ├── comandos_5.jpg ├── comandos_6.jpg ├── comandos_7.jpg ├── comandos_8.jpg ├── comandos_9.jpg ├── create_table_1.jpg ├── create_table_10.jpg ├── create_table_11.jpg ├── create_table_2.jpg ├── create_table_3.jpg ├── create_table_4.jpg ├── create_table_5.jpg ├── create_table_6.jpg ├── create_table_7.jpg ├── create_table_8.jpg ├── create_table_9.jpg ├── create_user_1.jpg ├── create_user_10.jpg ├── create_user_2.jpg ├── create_user_3.jpg ├── create_user_4.jpg ├── create_user_5.jpg ├── create_user_6.jpg ├── create_user_7.jpg ├── create_user_8.jpg ├── create_user_9.jpg ├── datos_remotos_1.jpg ├── datos_remotos_2.jpg ├── datos_remotos_3.jpg ├── diagrama_entidad_relacion_proyecto.jpg ├── diagrama_entidad_relacion_proyecto_styled.jpg ├── extensiones_1.jpg ├── extensiones_2.jpg ├── foreign_key_1.jpg ├── foreign_key_2.jpg ├── foreign_key_3.jpg ├── foreign_key_4.jpg ├── foreign_key_5.jpg ├── foreign_key_6.jpg ├── foreign_key_7.jpg ├── foreign_key_8.jpg ├── foreign_key_9.jpg ├── funciones_especiales_1.jpg ├── funciones_especiales_10.jpg ├── funciones_especiales_2.jpg ├── funciones_especiales_3.jpg ├── funciones_especiales_4.jpg ├── funciones_especiales_5.jpg ├── funciones_especiales_6.jpg ├── funciones_especiales_7.jpg ├── funciones_especiales_8.jpg ├── funciones_especiales_9.jpg ├── insersion_masiva_1.jpg ├── insersion_masiva_10.jpg ├── insersion_masiva_2.jpg ├── insersion_masiva_3.jpg ├── insersion_masiva_4.jpg ├── insersion_masiva_5.jpg ├── insersion_masiva_6.jpg ├── insersion_masiva_7.jpg ├── insersion_masiva_8.jpg ├── insersion_masiva_9.jpg ├── insert_1.jpg ├── insert_10.jpg ├── insert_11.jpg ├── insert_12.jpg ├── insert_13.jpg ├── insert_14.jpg ├── insert_15.jpg ├── insert_2.jpg ├── insert_3.jpg ├── insert_4.jpg ├── insert_5.jpg ├── insert_6.jpg ├── insert_7.jpg ├── insert_8.jpg ├── insert_9.jpg ├── join_1.jpg ├── maintenance_1.jpg ├── particiones_1.jpg ├── particiones_2.jpg ├── particiones_3.jpg ├── particiones_4.jpg ├── particiones_5.jpg ├── particiones_6.jpg ├── particiones_7.jpg ├── particiones_8.jpg ├── pgadmin_1.jpg ├── pgadmin_2.jpg ├── pgadmin_3.jpg ├── pgadmin_4.jpg ├── pgadmin_5.jpg ├── pgadmin_6.jpg ├── pl_1.jpg ├── pl_10.jpg ├── pl_11.jpg ├── pl_12.jpg ├── pl_13.jpg ├── pl_14.jpg ├── pl_2.jpg ├── pl_3.jpg ├── pl_4.jpg ├── pl_5.jpg ├── pl_6.jpg ├── pl_7.jpg ├── pl_8.jpg ├── pl_9.jpg ├── postgre_instal_1.jpg ├── postgre_instal_10.jpg ├── postgre_instal_11.jpg ├── postgre_instal_12.jpg ├── postgre_instal_13.jpg ├── postgre_instal_14.jpg ├── postgre_instal_15.jpg ├── postgre_instal_16.jpg ├── postgre_instal_17.jpg ├── postgre_instal_18.jpg ├── postgre_instal_19.jpg ├── postgre_instal_2.jpg ├── postgre_instal_3.jpg ├── postgre_instal_4.jpg ├── postgre_instal_5.jpg ├── postgre_instal_6.jpg ├── postgre_instal_7.jpg ├── postgre_instal_8.jpg ├── postgre_instal_9.jpg ├── replicas_1.jpg ├── replicas_10.jpg ├── replicas_11.jpg ├── replicas_12.jpg ├── replicas_13.jpg ├── replicas_14.jpg ├── replicas_15.jpg ├── replicas_16.jpg ├── replicas_17.jpg ├── replicas_2.jpg ├── replicas_3.jpg ├── replicas_4.jpg ├── replicas_5.jpg ├── replicas_6.jpg ├── replicas_7.jpg ├── replicas_8.jpg ├── replicas_9.jpg ├── tipos_join.jpg ├── transacciones_1.jpg ├── transacciones_2.jpg ├── transacciones_3.jpg ├── transacciones_4.jpg ├── transacciones_5.jpg ├── transacciones_6.jpg ├── trigger_1.jpeg ├── trigger_1.jpg ├── trigger_10.jpg ├── trigger_2.jpg ├── trigger_3.jpg ├── trigger_4.jpg ├── trigger_5.jpg ├── trigger_6.jpg ├── trigger_7.jpg ├── trigger_8.jpg ├── trigger_9.jpg ├── views_1.jpg ├── views_2.jpg ├── views_3.jpg ├── views_4.jpg ├── views_5.jpg └── views_6.jpg /.gitignore: -------------------------------------------------------------------------------- 1 | Examen Curso Postgres.pptx 2 | .vscode -------------------------------------------------------------------------------- /Notes/notes.md: -------------------------------------------------------------------------------- 1 | # Curso de PostgreSQL 2 | 3 | - [Curso de PostgreSQL](#curso-de-postgresql) 4 | - [Modulo 1 Configurar Postgres](#modulo-1-configurar-postgres) 5 | - [Clase 1 Introduccion](#clase-1-introduccion) 6 | - [Clase 2 Que es Postgresql](#clase-2-que-es-postgresql) 7 | - [Clase 3 Instalacion y configuración de la Base de Datos](#clase-3-instalacion-y-configuración-de-la-base-de-datos) 8 | - [Clase 4 Interacción con Postgres desde la Consola](#clase-4-interacción-con-postgres-desde-la-consola) 9 | - [Comandos importantes PostgreSQL](#comandos-importantes-postgresql) 10 | - [Clase 5 PgAdmin: Interaccion con Postgres desde la Interfaz Grafica](#clase-5-pgadmin-interaccion-con-postgres-desde-la-interfaz-grafica) 11 | - [Clase 6 Archivos de Configuracion](#clase-6-archivos-de-configuracion) 12 | - [Clase 7 Comandos mas utilizados en PostgreSQL](#clase-7-comandos-mas-utilizados-en-postgresql) 13 | - [Comandos de ayuda](#comandos-de-ayuda) 14 | - [Comandos de navegacion y consulta de informacion](#comandos-de-navegacion-y-consulta-de-informacion) 15 | - [Comandos de inspeccion y ejecucion](#comandos-de-inspeccion-y-ejecucion) 16 | - [Comandos para debug y optimizacion](#comandos-para-debug-y-optimizacion) 17 | - [Comandos para cerrar la consola](#comandos-para-cerrar-la-consola) 18 | - [Ejecutando consultas en la base de datos usando la consola](#ejecutando-consultas-en-la-base-de-datos-usando-la-consola) 19 | - [Clase 8 Presentación del Proyecto](#clase-8-presentación-del-proyecto) 20 | - [Clase 9 Tipos de Datos](#clase-9-tipos-de-datos) 21 | - [Clase 10 Diseñando nuestra base de datos: estructura de las tablas](#clase-10-diseñando-nuestra-base-de-datos-estructura-de-las-tablas) 22 | - [Clase 11 Jerarquia de Bases de Datos](#clase-11-jerarquia-de-bases-de-datos) 23 | - [Modulo 2 Gestión de la información en bases de datos](#modulo-2-gestión-de-la-información-en-bases-de-datos) 24 | - [Clase 12 Creación de Tablas](#clase-12-creación-de-tablas) 25 | - [clase 13 Particiones](#clase-13-particiones) 26 | - [Clase 14 Creacion de Roles](#clase-14-creacion-de-roles) 27 | - [Creando roles desde SQL Shell](#creando-roles-desde-sql-shell) 28 | - [Creando roles desde PGAdmin](#creando-roles-desde-pgadmin) 29 | - [Clase 15 Llaves foraneas](#clase-15-llaves-foraneas) 30 | - [Clase 16 Insercion y consulta de datos](#clase-16-insercion-y-consulta-de-datos) 31 | - [Clase 17 Insercion masiva de datos](#clase-17-insercion-masiva-de-datos) 32 | - [Modulo 3 Generar consultas avanzadas](#modulo-3-generar-consultas-avanzadas) 33 | - [Clase 18 Cruzar tablas: SQL JOIN](#clase-18-cruzar-tablas-sql-join) 34 | - [Clase 19 Funciones Especiales Principales](#clase-19-funciones-especiales-principales) 35 | - [Clase 20 Funciones Especiales Avanzadas](#clase-20-funciones-especiales-avanzadas) 36 | - [Clase 21 Vistas](#clase-21-vistas) 37 | - [Vista volatil](#vista-volatil) 38 | - [Vista Materializada](#vista-materializada) 39 | - [Clase 22 PL/SQL](#clase-22-plsql) 40 | - [Creando funciones con PL](#creando-funciones-con-pl) 41 | - [Creando funciones con PGAdmin](#creando-funciones-con-pgadmin) 42 | - [Clase 23 Triggers](#clase-23-triggers) 43 | - [Modulo 4 Integrar bases de datos con servicios externos](#modulo-4-integrar-bases-de-datos-con-servicios-externos) 44 | - [Clase 24 Simulando una conexion a Bases de Datos remotas](#clase-24-simulando-una-conexion-a-bases-de-datos-remotas) 45 | - [Clase 25 Transacciones](#clase-25-transacciones) 46 | - [Clase 26 Otras Extensiones para Postgres](#clase-26-otras-extensiones-para-postgres) 47 | - [Modulo 5 Implementar mejores prácticas](#modulo-5-implementar-mejores-prácticas) 48 | - [Clase 26 Backups y Restauracion](#clase-26-backups-y-restauracion) 49 | - [Clase 29 Mantenimiento](#clase-29-mantenimiento) 50 | - [Clase 29 Introduccion a Replicas](#clase-29-introduccion-a-replicas) 51 | - [Clase 30 Implementacion de Replicas en Postgres](#clase-30-implementacion-de-replicas-en-postgres) 52 | - [Configuracion Master](#configuracion-master) 53 | - [Configuracion Replica](#configuracion-replica) 54 | - [Clase 31 Otras buenas Practicas](#clase-31-otras-buenas-practicas) 55 | 56 | ## Modulo 1 Configurar Postgres 57 | 58 | ### Clase 1 Introduccion 59 | 60 | Introduccion por el profesor 61 | 62 | ### Clase 2 Que es Postgresql 63 | 64 | Postgre es un motor de base de datos open source y usa el Objeto-Relacional, existen tres conceptos importantes acerca de las bases de datos 65 | 66 | - lenguaje 67 | - motor: Permite estructurar toda la información dentro de un servidor 68 | - servidor 69 | 70 | Esta base de datos cumple con el estándar ACID (reglas para bases de datos para tener buenas practicas) 71 | 72 | **• A: Atomicity – Atomicidad** -> Separar las funciones desarrolladas en la BD como pequeñas tareas y ejecutarlas como un todo. Si alguna tarea falla se hace un rollback(Se deshacen los cambios) 73 | 74 | **• C: Consistency – Consistencia** -> Todo lo que se desarrolló en base al objeto relacional. Los datos tienen congruencia (gracias a PK y FK) 75 | 76 | **• I: Isolation – Aislamiento** -> Varias tareas ejecutándose al mismo tiempo dentro de la BD (o varias instancias) 77 | 78 | **• D: Durability – Durabilidad** -> Puedes tener seguridad que la información no se perderá por un fallo catastrófico. PostgreSQL guarda la información en una Bitácora y luego guarda el cambio efectivo en la base de datos. 79 | 80 | Por Que PostgreSQL 81 | 82 | - Tipos de Datos 83 | - Integridad de Datos 84 | - Concurrencia, Rendimiento 85 | - Fiabilidad, recuperación ante desastres 86 | - Seguridad 87 | - Extensibilidad 88 | - Internacionalizacion 89 | - Búsqueda de Texto 90 | - Funciones com PostGIS y PL 91 | 92 | ### Clase 3 Instalacion y configuración de la Base de Datos 93 | 94 | Vamos a instalar PostgreSQL en nuestra computadora. A continuación veremos el paso a paso y algunos consejos útiles para instalar y configurar correctamente PostgreSQL en nuestro equipo. En éste caso, usaremos Windows, pero los pasos son bastante similares entre los diferentes sistemas operativos. 95 | 96 | Primer paso: ir a y descargar la version acorde a tu sistema operativo, una vez dentro de esa seccion haz click en **download installer**. 97 | 98 | Es altamente recomendable seleccionar la penúltima o antepenúltima versión. Si bien la última versión estable está disponible, en éste caso la 2.0, no es recomendable instalarla en nuestro equipo, ya que al momento de instalarla o usar un servicio en la Nube para Postgres, lo más seguro es que no esté disponible y sólo esté hasta la versión.5, que no es la última versión. Esto porque todos los proveedores de Infraestructura no disponen de la versión de Postgres más actual siempre (tardan un poco en apropiar los nuevos lanzamientos). 99 | 100 | Si tienes un equipo con Linux, la instalación la puedes hacer directamente desde los repositorios de Linux, EDB ya no ofrece soporte para instaladores en Linux debido a que se ha vuelto innecesario, el repositorio de Linux con PostgreSQL ofrece una manera mucho más sencilla y estándar para instalar PostgreSQL en linux. 101 | 102 | Segundo paso: descargamos la versión “Windows x86-64” (porque nuestro sistema operativo es de 64 bits). En caso de que tu equipo sea de 32 bits debes seleccionar la opción “Windows x86-32”. 103 | 104 | Vamos a descargar la versión.5. Hacemos clic en Download y guardamos el archivo que tendrá un nombre similar a: 105 | “postgresql-.5-2-windows-x64.exe” 106 | 107 | Ahora vamos a la carpeta donde descargamos el archivo .exe, debe ser de aproximadamente 90 MB, lo ejecutamos. 108 | 109 | ![postgre_instal_](src/postgre_instal_1.jpg) 110 | 111 | Hacemos clic en siguiente. Si deseas cambiar la carpeta de destino, ahora es el momento: 112 | 113 | ![postgre_instal_2](src/postgre_instal_2.jpg) 114 | 115 | Seleccionamos los servicios que queremos instalar. En este caso dejamos seleccionados todos menos “Stack Builder”, pues ofrece la instalación de servicios adicionales que no necesitamos hasta ahora. Luego hacemos clic en siguiente: 116 | 117 | ![postgre_instal_3](src/postgre_instal_3.jpg) 118 | 119 | Ahora indicamos la carpeta donde iran guardados los datos de la base de datos, es diferente a la ruta de instalación del Motor de PostgreSQL, pero normalmente será una carpeta de nuestra carpeta de instalación. Puedes cambiar la ruta si quieres tener los datos en otra carpeta. Hacemos clic en siguiente. 120 | 121 | ![postgre_instal_4](src/postgre_instal_4.jpg) 122 | 123 | Ingresamos la contraseña del usuario administrador. De manera predeterminada, Postgres crea un usuario super administrador llamado **postgres** que tiene todos los permisos y acceso a toda la base de datos, tanto para consultarla como para modificarla. En éste paso indicamos la clave de ese usuario super administrador. 124 | 125 | Debes ingresar una clave muy segura y guardarla porque la vas a necesitar después. Luego hacemos clic en siguiente. 126 | 127 | ![postgre_instal_5](src/postgre_instal_5.jpg) 128 | 129 | Ahora si queremos cambiar el puerto por donde el servicio de Postgresql estará escuchando peticiones, podemos hacerlo en la siguiente pantalla, si queremos dejar el predeterminado simplemente hacemos clic en siguiente. 130 | 131 | ![postgre_instal_6](src/postgre_instal_6.jpg) 132 | 133 | La configuración regional puede ser la predeterminada, no es necesario cambiarla, incluso si vamos a usarla en español, ya que las tildes y las eñes estarán soportadas si dejas la configuración regional predeterminada. Es útil cambiarla cuando quieras dejar de soportar otras funciones de idiomas y lenguajes diferentes a uno específico. Luego hacemos clic en siguiente: 134 | 135 | ![postgre_instal_7](src/postgre_instal_7.jpg) 136 | 137 | En pantalla aparecerá el resumen de lo que se va a instalar: 138 | 139 | ![postgre_instal_8](src/postgre_instal_8.jpg) 140 | 141 | Al hacer clic en siguiente se muestra una pantalla que indica que PostgreSQL está listo para instalar, al hacer clic de nuevo en siguiente iniciará la instalación, espera un par de minutos hasta que la aplicación termine. 142 | 143 | Una vez terminada la instalación, aparecerá en pantalla un mensaje mostrando que PostgreSQL ha sido instalado correctamente. 144 | 145 | ![postgre_instal_9](src/postgre_instal_9.jpg) 146 | 147 | Podemos cerrar ésta pantalla y proceder a comprobar que todo quedó instalado correctamente. 148 | 149 | Vamos a buscar el programa PgAdmin, el cual usaremos como editor favorito para ejecutar en él todas las operaciones sobre nuestra base de datos. 150 | 151 | También vamos a buscar la consola… Tanto la consola como PgAdmin son útiles para gestionar nuestra base de datos, una nos permite ingresar comando por comandos y la otra nos ofrece una interfaz visual fácil de entender para realizar todas las operaciones. 152 | 153 | En el menú de Windows (o donde aparecen instalados todos los programas) buscamos “PgAdmin…” 154 | 155 | ![postgre_instal_0](src/postgre_instal_0.jpg) 156 | 157 | Ahora buscamos “SQL Shell…” 158 | 159 | ![postgre_instal_1](src/postgre_instal_1.jpg) 160 | 161 | Efectivamente, ahora aparecen las herramientas que vamos a utilizar en éste curso. 162 | Ahora vamos a crear una base de datos de prueba usando la consola y comprobaremos si existe usando PgAdmin, la crearemos para validar que la conexión con el servicio de base de datos interno funciona correctamente. 163 | 164 | Para ello abrimos la consola, buscamos SQL Shell y lo ejecutamos. Veremos algo así: 165 | 166 | ![postgre_instal_2](src/postgre_instal_2.jpg) 167 | 168 | Lo que vemos en pantalla es la consola esperando que ingresemos cada parámetro para la conexión. 169 | 170 | Primero está el nombre del parámetro. En éste caso es “Server” seguido de unos corchetes que contienen el valor predeterminado. Si presionamos “Enter” sin digitar nada la consola asumirá que te refieres al valor predeterminado, si en éste caso presionamos “Enter” el valor asumido será “Localhost”. Localhost se refiere a nuestra propia máquina, si instalaste la base de datos en el mismo pc que estás usando para la consola, el valor correcto es Localhost o 27.0.0. (representan lo mismo). 171 | 172 | Podemos dejar todos los valores predeterminados (presionando “Enter”) hasta que la consola pregunte por la clave del usuario maestro: 173 | 174 | ![postgre_instal_3](src/postgre_instal_3.jpg) 175 | 176 | Debemos ingresar la clave que usamos cuando estábamos instalando Postgres, de lo contrario no podremos acceder. Presionamos Enter y veremos a continuación una pantalla que nos indica que estamos logueados en la base de datos y estamos listos para hacer modificaciones. 177 | 178 | De manera predeterminada, la base de datos instalada es Postgres, la cual no debemos tocar, ya que ejecuta funciones propias del motor. Es usada por el Motor de PostgreSQL para interactuar con todas las bases de datos que vayamos a crear en el futuro. 179 | 180 | La siguiente imagen indica que estamos conectados a la base de datos Postgres. Vamos a crear una base de datos nueva y luego saltar el cursor a ésta base de datos recién creada. 181 | 182 | ![postgre_instal_4](src/postgre_instal_4.jpg) 183 | 184 | Para ello escribimos el comando “**CREATE DATABASE transporte_publico;**” y presionamos “Enter”. Veremos: 185 | 186 | ![postgre_instal_5](src/postgre_instal_5.jpg) 187 | 188 | El mensaje **“CREATE DATABASE”** justo después de la línea que acabamos de escribir indica que la base de datos fue creada correctamente. 189 | 190 | Para saltar a la base de datos recién creada ejecutamos el comando “**\c transporte_publico**”, el cursor mostrará lo siguiente: 191 | 192 | ![postgre_instal_6](src/postgre_instal_6.jpg) 193 | 194 | Ahora vamos a validar desde PgAdmin que la base de datos fué creada correctamente. Abrimos PgAdmin y nos encontramos con una lista de items a la izquierda, lo que significa que de manera predeterminada PgAdmin ha creado un acceso a nuestra base de datos local, el cual llamó “PostgreSQL”: 195 | 196 | ![postgre_instal_7](src/postgre_instal_7.jpg) 197 | 198 | Al hacer hacer doble clic sobre éste elemento (“PostgreSQL”) nos pedirá ingresar la clave que hemos determinado para el super usuario postgres, al igual que la consola, hasta no ingresarla correctamente no nos podremos conectar: 199 | 200 | ![postgre_instal_8](src/postgre_instal_8.jpg) 201 | 202 | Ingresamos la clave. Te recomiendo seleccionar la opción “Save Password” o “Guardar Contraseña”. Si la máquina sobre la que estás trabajando es de confianza, que seas sólo tú o tu equipo quien tenga acceso a ella, de lo contrario, no guardes la contraseña para mantenerla segura. 203 | 204 | Veremos la lista de bases de datos disponibles, la predeterminada “postgres” y la que acabamos de crear usando la consola, lo que comprueba que la base de datos y la consola funcionan correctamente. 205 | 206 | ![postgre_instal_9](src/postgre_instal_9.jpg) 207 | 208 | Ahora procedemos a eliminar la base de datos recién creada para comprobar que PgAdmin está correctamente configurada y si pueda realizar cambios sobre la base de datos. 209 | 210 | Para ello hacemos clic derecho sobre el elemento “transporte_publico” y seleccionamos la opción “Delete/Drop”. Al mensaje de confirmar hacemos clic en OK. 211 | 212 | Con ello, si el elemento “transporte_publico” desaparece del menú de la izquierda comprobamos que PgAdmin funcionan correctamente. 213 | 214 | ### Clase 4 Interacción con Postgres desde la Consola 215 | 216 | Vamos a aprender los comandos mas útiles en la shell, al iniciar siempre encontramos los siguientes puntos 217 | 218 | Server [localhost]: valor predeterminado o del server al que queremos conectarnos 219 | 220 | Database [postgres]: Escribe aquí la base de datos a la que quieres ingresar o enter para la predeterminada 221 | 222 | Port [5432]: Idem conceptos anteriores 223 | 224 | Username [postgres]: Idem conceptos anteriores 225 | 226 | Contraseña para usuario postgres: 227 | 228 | #### Comandos importantes PostgreSQL 229 | 230 | - **\l**: lista las bases de datos del sistema (siempre va a haber por default 3 bases de datos propias de postgre + las que agreguemos). 231 | 232 | - **\dt**" muestra las tablas de la base de datos de postgresql 233 | 234 | - **\c + nombre base de datos**: usar una base de datos 235 | 236 | - **\d + nombre tabla consultar**: describe el contenido de una tabla especifica. 237 | 238 | - **\h SELECT**: ayuda para funciones estándar SQL. 239 | 240 | - **SELECT version();**: ver la version de PostgreSQL 241 | 242 | - **\g** permite volver a ejecutar la funcion previa ejecutada en consola (repetir lo anterior). 243 | 244 | - **\timing**: muestra el tiempo de ejecución de un comando, algo muy importante para las optimizaciones. 245 | 246 | ### Clase 5 PgAdmin: Interaccion con Postgres desde la Interfaz Grafica 247 | 248 | Esta clase retoma los comandos anteriores del shell ahora con la interfaz grafica. 249 | 250 | Para conectarnos tenemos el item PostgreSQL( ), a diferencia de la shell PGAdmin permite hacer cosas custom como colores y tags. 251 | 252 | Creamos una base de datos propia usando la parte de server del arbol del admin. 253 | 254 | En el dashboard podemos observar como Postgres usa el mismo motor de forma redundante para hacerse consultas a si mismo y saber que esta pasando en el entorno de ejecución para esta base de datos. 255 | 256 | En la parte del Admin en Server podemos crear una base de datos desde cero a partir del servidor y conectarla al localhost o a una base de datos alojada en un server local o remoto. 257 | 258 | ![pgadmin_](src/pgadmin_1.jpg) 259 | 260 | ![pgadmin_2](src/pgadmin_2.jpg) 261 | 262 | ![pgadmin_3](src/pgadmin_3.jpg) 263 | 264 | ![pgadmin_4](src/pgadmin_4.jpg) 265 | 266 | Podemos usar en el menu de tools el Query tools 267 | 268 | ![pgadmin_5](src/pgadmin_5.jpg) 269 | 270 | ![pgadmin_6](src/pgadmin_6.jpg) 271 | 272 | ### Clase 6 Archivos de Configuracion 273 | 274 | Antes de crear tablas o hacer diseños es importante conocer 3 archivos de configuracion que muchas veces son el origen de los problemas cuando estamos agregando nuevos servicios o configurando la base de datos 275 | 276 | Los archivos de configuración son tres principales: 277 | 278 | - **postgreql.conf**: en este archivo podemos cambiar puerto, numero de conexiones maxima, accesos para ip únicas. (un pro en bases de datos siempre ha leído todo el documento). En este archivo también se encuentra la información de las replicas 279 | 280 | - **pg.hba.conf**: contiene los roles, tipos de usuarios, permisos, direcciones, métodos de acceso con MD5, también puedo negar a otros hosts a conectarnos,este archivo es muy importante dado que nos permite no solo dar acceso a usuarios y a las replicas sino protegernos de ataques o personas mal intencionados 281 | 282 | - **pg_ident.conf** 283 | 284 | La ruta de los mismos depende del sistema Operativo, para saber que que ruta están, basta con hacer una Query 285 | 286 | **SHOW config_file**; 287 | 288 | NOTA: siempre es bueno hacer una copia original de los archivos antes de modificarlos por si movemos algo que no. 289 | 290 | ### Clase 7 Comandos mas utilizados en PostgreSQL 291 | 292 | La consola en PostgreSQL es una herramienta muy potente para crear, administrar y depurar nuestra base de datos. podemos acceder a ella después de instalar PostgreSQL y haber seleccionado la opción de instalar la consola junto a la base de datos. 293 | 294 | PostgreSQL está más estrechamente acoplado al entorno UNIX que algunos otros sistemas de bases de datos, utiliza las cuentas de usuario nativas para determinar quién se conecta a ella (de forma predeterminada). El programa que se ejecuta en la consola y que permite ejecutar consultas y comandos se llama psql, psql es la terminal interactiva para trabajar con PostgreSQL, es la interfaz de línea de comando o consola principal, así como PgAdmin es la interfaz gráfica de usuario principal de PostgreSQL. 295 | 296 | Después de emitir un comando PostgreSQL, recibirás comentarios del servidor indicándote el resultado de un comando o mostrándote los resultados de una solicitud de información. Por ejemplo, si deseas saber qué versión de PostgreSQL estás usando actualmente, puedes hacer lo siguiente: 297 | 298 | ```sql 299 | SELECT version() 300 | 301 | ``` 302 | 303 | #### Comandos de ayuda 304 | 305 | En consola los dos principales comandos con los que podemos revisar el todos los comandos y consultas son: 306 | 307 | **\?** Con el cual podemos ver la lista de todos los comandos disponibles en consola, comandos que empiezan con backslash() 308 | 309 | ![comandos_](src/comandos_1.jpg) 310 | 311 | **\h** Con este comando veremos la información de todas las consultas SQL disponibles en consola. Sirve también para buscar ayuda sobre una consulta específica, para buscar información sobre una consulta específica basta con escribir \h seguido del inicio de la consulta de la que se requiera ayuda, así: \h ALTER 312 | 313 | De esta forma podemos ver toda la ayuda con respecto a la consulta ALTER 314 | 315 | ![comandos_2](src/comandos_2.jpg) 316 | 317 | #### Comandos de navegacion y consulta de informacion 318 | 319 | **\c** Saltar entre bases de datos 320 | 321 | **\l** Listar base de datos disponibles 322 | 323 | **\dt** Listar las tablas de la base de datos 324 | 325 | **\d ** Describir una tabla 326 | 327 | **\dn** Listar los esquemas de la base de datos actual 328 | 329 | **\df** Listar las funciones disponibles de la base de datos actual 330 | 331 | **\dv** Listar las vistas de la base de datos actual 332 | 333 | **\du** Listar los usuarios y sus roles de la base de datos actual 334 | 335 | #### Comandos de inspeccion y ejecucion 336 | 337 | **\g** Volver a ejecutar el comando ejecutando justo antes 338 | 339 | **\s** Ver el historial de comandos ejecutados 340 | 341 | **\s ** Si se quiere guardar la lista de comandos ejecutados en un archivo de texto plano 342 | 343 | **\i ** Ejecutar los comandos desde un archivo 344 | 345 | **\e** Permite abrir un editor de texto plano, escribir comandos y ejecutar en lote. \e abre el editor de texto, escribir allí todos los comandos, luego guardar los cambios y cerrar, al cerrar se ejecutarán todos los comandos guardados. 346 | 347 | **\ef** Equivalente al comando anterior pero permite editar también funciones en PostgreSQL\ 348 | 349 | #### Comandos para debug y optimizacion 350 | 351 | **\timing** Activar / Desactivar el contador de tiempo por consulta 352 | 353 | #### Comandos para cerrar la consola 354 | 355 | **\q** Cerrar la consola 356 | 357 | #### Ejecutando consultas en la base de datos usando la consola 358 | 359 | De manera predeterminada PostgreSQL no crea bases de datos para usar, debemos crear nuestra base de datos para empezar a trabajar, verás que existe ya una base de datos llamada **postgres** pero no debe ser usada ya que hace parte del CORE de PostgreSQL y sirve para gestionar las demás bases de datos. 360 | 361 | Para crear una base de datos debes ejecutar la consulta de creación de base de datos, es importante entender que existe una costumbre no oficial al momento de escribir consultas; consiste en poner en mayúsculas todas las palabras propias del lenguaje SQL cómo **CREATE**, **SELECT**, **ALTER**, etc y el resto de palabras como los nombres de las tablas, columnas, nombres de usuarios, etc en minúscula. No está claro el porqué de esta especie de “estándar” al escribir consultas SQL pero todo apunta a que en el momento que SQL nace, no existían editores de consultas que resaltaran las palabras propias del lenguaje para diferenciar fácilmente de las palabras que no son parte del lenguaje, por eso el uso de mayúsculas y minúsculas. 362 | 363 | Las palabras reservadas de consultas SQL usualmente se escriben en mayúscula, ésto para distinguir entre nombres de objetos y lenguaje SQL propio, no es obligatorio, pero podría serte útil en la creación de Scripts SQL largos. 364 | 365 | Vamos ahora por un ligero ejemplo desde la creación de una base de datos, la creación de una tabla, la inserción, borrado, consulta y alteración de datos de la tabla. 366 | 367 | Primero crea la base de datos, **“CREATE DATABASE transporte;”** sería el primer paso. 368 | 369 | ![comandos_3](src/comandos_3.jpg) 370 | 371 | Ahora saltar de la base de datos **postgres** que ha sido seleccionada de manera predeterminada a la base de datos transporte recién creada utilizando el comando \c transporte. 372 | 373 | ![comandos_4](src/comandos_4.jpg) 374 | 375 | Ahora vamos a crear la tabla tren, el SQL correspondiente sería: 376 | 377 | ```sql 378 | CREATE TABLE tren ( id serial NOT NULL, modelo character varying, capacidad integer, CONSTRAINT tren_pkey PRIMARY KEY (id) ); 379 | ``` 380 | 381 | La columna id será un número autoincremental (cada vez que se inserta un registro se aumenta en uno), modelo se refiere a una referencia al tren, capacidad sería la cantidad de pasajeros que puede transportar y al final agregamos la llave primaria que será id. 382 | 383 | ![comandos_5](src/comandos_5.jpg) 384 | 385 | Ahora que la tabla ha sido creada, podemos ver su definición utilizando el comando `\d tren` 386 | 387 | ![comandos_6](src/comandos_6.jpg) 388 | 389 | PostgreSQL ha creado el campo id automáticamente cómo integer con una asociación predeterminada a una secuencia llamada ‘tren_id_seq’. De manera que cada vez que se inserte un valor, id tomará el siguiente valor de la secuencia, vamos a ver la definición de la secuencia. Para ello, \d `tren_id_seq` es suficiente: 390 | 391 | ![comandos_7](src/comandos_7.jpg) 392 | 393 | Vemos que la secuencia inicia en uno, así que nuestra primera inserción de datos dejará a la 394 | columna id con valor uno. 395 | 396 | ```sql 397 | INSERT INTO tren( modelo, capacidad ) VALUES (‘Volvo ’, 00); 398 | ``` 399 | 400 | ![comandos_8](src/comandos_8.jpg) 401 | 402 | ```sql 403 | SELECT * FROM tren; 404 | ``` 405 | 406 | Consultamos ahora los datos en la tabla: 407 | 408 | ![comandos_9](src/comandos_9.jpg) 409 | 410 | Vamos a modificar el valor, establecer el tren con id uno que sea modelo Honda 0726. Para ello ejecutamos la consulta tipo **UPDATE tren SET modelo = 'Honda 0726' Where id = 1**; 411 | 412 | ![comandos_0](src/comandos_0.jpg) 413 | 414 | Verificamos la modificación **SELECT * FROM tren;** 415 | 416 | ![comandos_ ](src/comandos_ .jpg) 417 | 418 | Ahora borramos la fila: **DELETE FROM tren WHERE id = ;** 419 | 420 | ![comandos_2](src/comandos_2.jpg) 421 | 422 | Verificamos el borrado **SELECT * FROM tren;** 423 | 424 | ![comandos_3](src/comandos_3.jpg) 425 | 426 | El borrado ha funcionado tenemos 0 rows, es decir, no hay filas. Ahora activemos la herramienta que nos permite medir el tiempo que tarda una consulta **\timing** 427 | 428 | ![comandos_4](src/comandos_4.jpg) 429 | 430 | Probemos cómo funciona al medición realizando la encriptación de un texto cualquiera usando el algoritmo md5: 431 | 432 | ![comandos_5](src/comandos_5.jpg) 433 | 434 | La consulta tardó 0.0mili-segundos 435 | 436 | Ahora que sabes como manejar algunos de los comandos más utilizados en PostgreSQL es momento de comenzar a practicar!!! 437 | 438 | ### Clase 8 Presentación del Proyecto 439 | 440 | El proyecto consiste en el modelado de un sistema de transporte de personas mediante trenes. 441 | 442 | Reto 443 | 444 | - Pasajero 445 | - Trayecto 446 | - Estación 447 | - Tren 448 | - Viaje 449 | 450 | ### Clase 9 Tipos de Datos 451 | 452 | PostgreSQL soporta los siguientes tipos de datos 453 | 454 | Principales y comunes en SQL: 455 | 456 | - Numéricos(Números enteros, Números Decimales, Seriales) 457 | - Monetarios(cantidad de moneda) 458 | - Texto(almacenar cadenas y texto, existen tres VARCHAR, CHAR, TEXT) 459 | - Binario(1 Y 0) 460 | - Fecha/Hora(Para almacenar Fechas y/o Horas, DATE TYPE, TIME TYPE, TIMESTAMP, INTERVAL) 461 | - Boolean(Verdadero o Falso) 462 | 463 | Especiales propios de postgres 464 | 465 | - Geométricos: Permiten calcular distancias y áreas usando dos valores X y Y. 466 | - Direcciones de Red: Cálculos de máscara de red 467 | - Texto tipo bit: Cálculos en otros sistemas, ejm(hexadecimal, binario) 468 | XML, JSON: Postgres no permite guardar en estos formatos 469 | - Arreglos: Vectores y Matrices 470 | 471 | ### Clase 10 Diseñando nuestra base de datos: estructura de las tablas 472 | 473 | ![diagrama_entidad_relacion_proyecto](src/diagrama_entidad_relacion_proyecto.jpg) 474 | 475 | ### Clase 11 Jerarquia de Bases de Datos 476 | 477 | Toda jerarquía de base de datos se basa en los siguientes elementos: 478 | 479 | - **Servidor de base de datos:** Computador que tiene un motor de base de datos instalado y en ejecución. 480 | 481 | - **Motor de base de datos:** Software que provee un conjunto de servicios encargados de administrar una base de datos. 482 | 483 | - **Base de datos:** Grupo de datos que pertenecen a un mismo contexto. 484 | 485 | - **Esquemas de base de datos en PostgreSQL:** Grupo de objetos de base de datos que guarda relación entre sí (tablas, funciones, relaciones, secuencias). 486 | 487 | - **Tablas de base de datos:** Estructura que organiza los datos en filas y columnas formando una matriz. 488 | 489 | **PostgreSQL es un motor de base de datos**. 490 | 491 | La estructura de la base de datos diseñada para el reto corresponde a los siguientes 492 | elementos: 493 | 494 | ![bd_proyecto](src/bd_proyecto.jpg) 495 | 496 | La base de datos se llama transporte, usaremos su esquema predeterminado public. 497 | 498 | El esquema public contiene las siguientes tablas: 499 | 500 | - Estación 501 | - Pasajero 502 | - Tren 503 | 504 | Y las tablas de relaciones entre cada uno de los elementos anteriores son: 505 | 506 | - Trayecto 507 | - Viaje 508 | 509 | El esquema relacional entre las tablas corresponde al siguiente diagrama: 510 | 511 | ![diagrama_entidad_relacion_proyecto_styled](src/diagrama_entidad_relacion_proyecto_styled.jpg) 512 | 513 | **Estación** 514 | Contiene la información de las estaciones de nuestro sistema, incluye datos de nombre con tipo de dato texto y dirección con tipo de dato texto, junto con un número de identificación único por estación. 515 | 516 | **Tren** 517 | Almacena la información de los trenes de nuestro sistema, cada tren tiene un modelo con tipo de dato texto y una capacidad con tipo de dato numérico que representa la cantidad de personas que puede llevar ese tren, también tiene un ID único por tren. 518 | 519 | **Trayecto** 520 | Relaciona los trenes con las estaciones, simula ser las rutas que cada uno de los trenes pueden desarrollar entre las estaciones 521 | 522 | **Pasajero** 523 | Es la tabla que contiene la información de las personas que viajan en nuestro sistema de transporte masivo, sus columnas son nombre tipo de dato texto con el nombre completo de la persona, dirección_residencia con tipo de dato texto que indica dónde vive la persona, fecha_nacimiento tipo de dato texto y un ID único tipo de dato numérico para identificar a cada persona. 524 | 525 | **Viaje** 526 | Relaciona Trayecto con Pasajero ilustrando la dinámica entre los viajes que realizan las personas, los cuales parten de una estación y se hacen usando un tren. 527 | 528 | ## Modulo 2 Gestión de la información en bases de datos 529 | 530 | ### Clase 12 Creación de Tablas 531 | 532 | Las tablas en PostgreSQL siguen el estándar SQL para las tablas 533 | 534 | - CREATE 535 | - ALTER 536 | - DROP 537 | 538 | **Creación una base de datos en pgAdmin**. 539 | 540 | En el arbol del server damos click derecho en nuestra BD_PRUEBAS/databases en la opcion CREATE y asignamos un nombre. 541 | 542 | ![create_table_](src/create_table_1.jpg) 543 | 544 | PGAdmin también nos muestra la sentencia que ejecutara por debajo en consola. 545 | 546 | ![create_table_2](src/create_table_2.jpg) 547 | 548 | Se crea todo el arbol relacionado a la base de datos, dentro de este se encuentran los Schemas, de manera predeterminada se crea el Schema public en el vamos a crear nuestra primera tabla 549 | 550 | ![create_table_3](src/create_table_3.jpg) 551 | 552 | Le asignamos el nombre de pasajero (aunque como practica común las tablas se nombren en plural) 553 | 554 | ![create_table_4](src/create_table_4.jpg) 555 | 556 | Y creamos las columnas definidas en nuestro diagrama entidad-relacion 557 | 558 | ![create_table_5](src/create_table_5.jpg) 559 | 560 | Nota: 561 | 562 | **Serial** es un tipo de dato de postgreSQL y corresponde a un tipo de dato Integer Autoincremental. 563 | 564 | **Character Varying** es un tipo de dato similar a Varchar en otros manejadores, si no estamos seguros de la longitud podemos dejar el area vacía. 565 | 566 | **Date** Corresponde a fechas. 567 | 568 | Ahora definimos los constraints para definir nuestra llave primaria, el **estándar de postgres** es **nombre_de_la_tabla_pkey** 569 | 570 | ![create_table_6](src/create_table_6.jpg) 571 | 572 | Al final podemos ver la sentencia SQL y guardamos nuestra tabla. 573 | 574 | ![create_table_7](src/create_table_7.jpg) 575 | 576 | Con ello creamos la tabla pasajero, ahora usaremos PGAdmin para crear el script de inserción dando click derecho a la tabla y seleccionando insert, esto crear el script automáticamente para (INSERT INTO de SQL) agregar los datos. 577 | 578 | ![create_table_8](src/create_table_8.jpg) 579 | 580 | ![create_table_9](src/create_table_9.jpg) 581 | 582 | Borramos **id** por ser autoincremental 583 | 584 | Para obtener la fecha actual escribimos y saber en que formato insertar los datos 585 | 586 | ```sql 587 | SELECT current_date; 588 | ``` 589 | 590 | Insertamos el registro seleccionado solo el query a realizar y usamos el boten de play o F5. 591 | 592 | ![create_table_0](src/create_table_0.jpg) 593 | 594 | Podemos verificar que los datos yendo a los query tools y hacemos la consulta de la tabla. 595 | 596 | **Reto:** crear las tablas faltantes del diagrama entidad-relacion. 597 | 598 | Aquí los scripts del reto 599 | 600 | ```sql 601 | -- Crear tabla tren 602 | CREATE TABLE public.tren 603 | ( 604 | id serial, 605 | modelo character varying(20), 606 | capacidad character varying, 607 | CONSTRAINT tren_pkey PRIMARY KEY (id) 608 | ) 609 | WITH ( 610 | OIDS = FALSE 611 | ); 612 | 613 | ALTER TABLE public.tren 614 | OWNER to postgres; 615 | 616 | 617 | -- Crear tabla estacion 618 | CREATE TABLE public.estacion 619 | ( 620 | id serial, 621 | nombre character varying, 622 | direccion character varying, 623 | CONSTRAINT estacion_pkey PRIMARY KEY (id) 624 | ) 625 | WITH ( 626 | OIDS = FALSE 627 | ); 628 | 629 | ALTER TABLE public.estacion 630 | OWNER to postgres; 631 | 632 | -- Crear tabla trayecto 633 | CREATE TABLE public.trayecto 634 | ( 635 | id serial, 636 | id_estacion integer, 637 | id_tren integer, 638 | nombre character varying, 639 | CONSTRAINT trayecto_pkey PRIMARY KEY (id) 640 | ) 641 | WITH ( 642 | OIDS = FALSE 643 | ); 644 | 645 | -- Crear tabla trayecto 646 | ALTER TABLE public.trayecto 647 | OWNER to postgres; 648 | 649 | CREATE TABLE public.viaje 650 | ( 651 | id serial, 652 | id_pasajero integer, 653 | id_trayecto integer, 654 | inicio date, 655 | fin date, 656 | CONSTRAINT viaje_pkey PRIMARY KEY (id) 657 | ) 658 | WITH ( 659 | OIDS = FALSE 660 | ); 661 | 662 | ALTER TABLE public.viaje 663 | OWNER to postgres; 664 | ``` 665 | 666 | ### clase 13 Particiones 667 | 668 | En ocasiones llega un punto en elq ue tienes mucha informacion en una sola tabla, y al momento de consultarla la base de datos tendrá que hacer el recorrido de toda la informacion para encontrar el contenido que estas buscando. 669 | 670 | Imagina que nuestra tabla de viajes tiene cien mil registros, y que quieres consultar los viajes realizados en un rango de fechas, esa consulta ocupara un espacio en memoria que deberá ser leída para obtener la respuesta, en este punto entran las particiones. 671 | 672 | Las particiones tiene como ventaja lo siguiente: 673 | 674 | - Separación física de datos 675 | - Conservan la Estructura Lógica 676 | 677 | La separacion física hace referencia a que es posible guardar varias parte de la misma tabla en diferentes espacios de disco o incluso en otros discos, internamente Postgre usando el mismo nombre de la tabla asigna otras pequeñas tablas que tienen un rango definido, en nuestro caso le diríamos que el rango son las fechas o las horas, por ejemplo una partición para junio, otra para julio y al hacer la consulta con el mismo **SELECT** de siempre Postgre buscaría la informacion solo en la partición correspondiente, esto reduce el tiempo de ejecucion de la consulta y a su vez evita que la tabla se bloquee al ser consultada o escrita demasiadas veces en periodos de tiempo cortos. 678 | 679 | En esta clase vamos a crear una tabla, asignarle particiones y después hacer un **INSERT** común y corriente y hacer una consulta común y corriente con pgAdmin. 680 | 681 | Creamos la tabla bitacora_viaje con toda la informacion de los viajes tendra los campos id, id_viaje, fecha, fecha sera el campo por el cual vamos a particionar la tabla. 682 | 683 | ![particiones_1](src/particiones_1.jpg) 684 | 685 | **Como lo hacemos?** 686 | 687 | Primero indicamos a la tabla que haremos la partición y luego por cual campo seria, para después agregar cada una de las particiones por separado para ello iremos al apartado **Partition**. 688 | 689 | Dejamos constraints vacío, y en General indicamos que es una tabla particionada. 690 | 691 | ![particiones_2](src/particiones_2.jpg) 692 | 693 | Con ello nos pide una llave para hacer la partición, la asignamos en la tabla partitions 694 | 695 | ![particiones_3](src/particiones_3.jpg) 696 | 697 | ![particiones_4](src/particiones_4.jpg) 698 | 699 | Creamos un **INSERT** para dicha tabla. 700 | 701 | ![particiones_5](src/particiones_5.jpg) 702 | 703 | Observamos el error al no existir ninguna partición, ahora hay que crearla, esto lo hacemos creando una nueva tabla 704 | 705 | ```sql 706 | CREATE TABLE bitacora_viaje_200_0 PARTITION OF bitacora_viaje 707 | FOR VALUES FROM ('200-0-0') TO ('209-0-3') 708 | ``` 709 | 710 | Creamos la tabla de partición para 200 del mes de enero ahora todos los **INSERT** correspondientes a ese rango de tiempo se guardaran en esa tabla. 711 | 712 | ![particiones_6](src/particiones_6.jpg) 713 | 714 | Ejecutamos el INSERT con un rango de la partición. 715 | 716 | ![particiones_7](src/particiones_7.jpg) 717 | 718 | Pero en contraste de que si queremos insertar datos fuera de ese rango de tiempo la operación nos arrojara un error como al principio, por lo tanto tendremos que crear una nueva partición. 719 | 720 | Observa que las particiones si existen físicamente. 721 | 722 | ![particiones_8](src/particiones_8.jpg) 723 | 724 | Nota final, no es posible crear llaves primarias en tablas particionadas ya que la informacion esta toda dividas, no te preocupes estas tablas se utilizan para guardar informacion en masa como bitácoras y hacen referencia a tablas que si tienen estas llaves primarias (miralo como un pivot table) 725 | 726 | Si vas a crear un proyecto donde tengas informacion histórica es buena practica iniciarla como una tabla particionada para mejorar el performance de nuestra aplicación 727 | 728 | En mi ejemplo use un rango de 9 años de 200 a 209, pero si la data es enorme podemos hacer particiones en unidades de meses, semanas o dias. 729 | 730 | Una vez aprendido este concepto borramos la tabla, ya que no es necesaria para el proyecto. 731 | 732 | ### Clase 14 Creacion de Roles 733 | 734 | Hemos creado la tablas, ahora debemos mirar los roles, estos igual que las tablas tienen la capacidad de ser creados y eliminados, sin embargo tiene las siguientes caracteristicas especiales. 735 | 736 | - Crear y eliminar otros roles 737 | - Asignar atributos 738 | - Agrupar con otros roles (conjunto global de permisos) 739 | - Roles predeterminados 740 | - Son independientes de las bases de datos 741 | 742 | Hasta ahora hemos estado utilizando el usuario predeterminado de postgres, lo cual sabemos que es muy peligroso ya que al ser un usuario de tipo root este tiene todos los privilegios para borrar todo, lo ideal es crear un usuario para trabajar con los roles y permisos adecuados. 743 | 744 | #### Creando roles desde SQL Shell 745 | 746 | Crearemos un rol con la terminal que tenga la capacidad de hacer login 747 | 748 | ```sql 749 | \H CREATE ROLE 750 | 751 | CREATE ROLE nombre [ [ WITH ] opción [ ... ] ] 752 | 753 | donde opción puede ser: 754 | 755 | SUPERUSER | NOSUPERUSER 756 | | CREATEDB | NOCREATEDB 757 | | CREATEROLE | NOCREATEROLE 758 | | INHERIT | NOINHERIT 759 | | LOGIN | NOLOGIN 760 | | REPLICATION | NOREPLICATION 761 | | BYPASSRLS | NOBYPASSRLS 762 | | CONNECTION LIMIT limite_conexiones 763 | | [ ENCRYPTED ] PASSWORD 'contraseña' | PASSWORD NULL 764 | | VALID UNTIL 'fecha_hora' 765 | | IN ROLE nombre_de_rol [, ...] 766 | | IN GROUP nombre_de_rol [, ...] 767 | | ROLE nombre_de_rol [, ...] 768 | | ADMIN nombre_de_rol [, ...] 769 | | USER nombre_de_rol [, ...] 770 | | SYSID uid 771 | ``` 772 | 773 | CREATE USER es un alias de CREATE ROLE 774 | 775 | ```sql 776 | postgres=# CREATE ROLE usuario_consulta; 777 | CREATE ROLE 778 | postgres=# \dg 779 | Lista de roles 780 | Nombre de rol | Atributos | Miembro de 781 | ------------------+------------------------------------------------------------+------------ 782 | postgres| Superusuario, Crear rol, Crear BD, Replicacion, Ignora RLS | {} 783 | usuario_consulta | No puede conectarse | {} 784 | 785 | 786 | postgres=# 787 | ``` 788 | 789 | En este punto hemos creado un nuevo usuario/role, pero este no tiene atributos/permisos para realizar ninguna acción, solucionamos esto igual que una tabla con el comando ALTER. 790 | 791 | ```sql 792 | postgres=# ALTER ROLE usuario_consulta WITH LOGIN; 793 | ALTER ROLE 794 | 795 | 796 | postgres=# \dg 797 | Lista de roles 798 | Nombre de rol | Atributos | Miembro de 799 | ------------------+------------------------------------------------------------+------------ 800 | postgres| Superusuario, Crear rol, Crear BD, Replicacion, Ignora RLS | {} 801 | usuario_consulta | | {} 802 | 803 | ``` 804 | 805 | Observamos ahora que desaparece la leyenda de que el usuario no puede conectarse, ahora realizamos la misma operación para darle los atributos de un superusuario. 806 | 807 | ```SQL 808 | postgres=# ALTER ROLE usuario_consulta SUPERUSER; 809 | ALTER ROLE 810 | postgres=# \dg 811 | Lista de roles 812 | Nombre de rol | Atributos | Miembro de 813 | ------------------+------------------------------------------------------------+------------ 814 | postgres| Superusuario, Crear rol, Crear BD, Replicacion, Ignora RLS | {} 815 | usuario_consulta | Superusuario | {} 816 | ``` 817 | 818 | Ahora asignamos la contraseña a la base de datos. 819 | 820 | ```sql 821 | postgres=# ALTER ROLE usuario_consulta WITH PASSWORD 'etc23'; 822 | ``` 823 | 824 | Ahora ya nos podemos cambiar nuestro rol accediendo con otra consola accediendo con el usuario_consulta 825 | 826 | ```sql 827 | Server [localhost]: 828 | Database [postgres]: 829 | Port [5432]: 830 | Username [postgres]: usuario_consulta 831 | Contraseña para usuario usuario_consulta: 832 | psql ( .9) 833 | ADVERTENCIA: El código de página de la consola (850) difiere del código 834 | de página de Windows (252). 835 | Los caracteres de 8 bits pueden funcionar incorrectamente. 836 | Vea la página de referencia de psql «Notes for Windows users» 837 | para obtener más detalles. 838 | Digite «help» para obtener ayuda. 839 | postgres=# 840 | ``` 841 | 842 | Ahora hacemos la operación de borrado desde otro perfil de superusuario en este caso el default postgres 843 | 844 | ```sql 845 | postgres=# DROP ROLE usuario_consulta; 846 | DROP ROLE 847 | postgres=# \dg 848 | Lista de roles 849 | Nombre de rol | Atributos | Miembro de 850 | ---------------+------------------------------------------------------------+------------ 851 | postgres | Superusuario, Crear rol, Crear BD, Replicacion, Ignora RLS | {} 852 | 853 | postgres=# 854 | 855 | ``` 856 | 857 | #### Creando roles desde PGAdmin 858 | 859 | ![create_user_](src/create_user_1.jpg) 860 | 861 | ![create_user_2](src/create_user_2.jpg) 862 | 863 | Asignamos un password 864 | 865 | ![create_user_3](src/create_user_3.jpg) 866 | 867 | Asignamos permisos para solo lectura 868 | 869 | ![create_user_4](src/create_user_4.jpg) 870 | 871 | ![create_user_5](src/create_user_5.jpg) 872 | 873 | Ahora vamos a darle permisos a nuestras tablas para que el usuario_consulta pueda tener acceso a interactuar informacion y consultarla, este no podrá acceder a la estructura de la misma ni borrar informacion 874 | 875 | ![create_user_6](src/create_user_6.jpg) 876 | 877 | ![create_user_7](src/create_user_7.jpg) 878 | 879 | Damos click en next y seleccionamos los permisos que se otorgaran en este caso insert, select y update 880 | 881 | ![create_user_8](src/create_user_8.jpg) 882 | 883 | ![create_user_9](src/create_user_9.jpg) 884 | 885 | Verificamos que en las otras tablas. 886 | 887 | ![create_user_0](src/create_user_0.jpg) 888 | 889 | ### Clase 15 Llaves foraneas 890 | 891 | Ya tenemos las tablas con sus llaves primarias, hemos creado los roles, ahora tenemos que crear las llaves foraneas estas hacen referencia a la informacion que existe entre las tablas y corresponde con nuestro ACID estándar en la parte de consistencia , es decir que todas las tablas corresponden entre si y la informacion es congruente. 892 | 893 | Para ello tenemos que entender que las llaves foraneas siguen una estructura muy básica: 894 | 895 | - Tabla de origen 896 | - Tabla destino 897 | - Acciones en caso de modificación en la tabla de origen 898 | 899 | Vamos a definir la primer relacion con el trayecto y sus relaciones con las otras tablas, vemos en los constraints donde nos indica cual valor es una llave primaria y asegura que ese valor sea único, y a continuación damos click en Foreign Key para definir las relaciones con las otras tablas. 900 | 901 | ![foreign_key_](src/foreign_key_1.jpg) 902 | 903 | Damos click en el símbolo de + para que acepte los cambios, la pestaña de Action es la mas importante ya que se indica que acciones se llevaran a cabo cuando ocurra un cambio en la tabla principal. 904 | 905 | ![foreign_key_2](src/foreign_key_2.jpg) 906 | 907 | ![foreign_key_3](src/foreign_key_3.jpg) 908 | 909 | A continuación creamos la relacion de trayecto con tren usando el Query Tool 910 | 911 | ```sql 912 | ALTER TABLE trayecto ADD CONSTRAINT trayecto_tren_fk FOREIGN KEY (id_tren) 913 | REFERENCES public.tren (id) MATCH SIMPLE 914 | ON UPDATE CASCADE 915 | ON DELETE CASCADE 916 | ``` 917 | 918 | ![foreign_key_4](src/foreign_key_4.jpg) 919 | 920 | Aplicaremos lo mismo con la tabla de viaje 921 | 922 | ![foreign_key_5](src/foreign_key_5.jpg) 923 | 924 | ![foreign_key_6](src/foreign_key_6.jpg) 925 | 926 | ![foreign_key_7](src/foreign_key_7.jpg) 927 | 928 | ```sql 929 | ALTER TABLE public.viaje 930 | ADD CONSTRAINT viaje_trayecto_fkey FOREIGN KEY (id_trayecto) 931 | REFERENCES public.trayecto (id) MATCH SIMPLE 932 | ON UPDATE CASCADE 933 | ON DELETE CASCADE 934 | 935 | ``` 936 | 937 | ![foreign_key_8](src/foreign_key_8.jpg) 938 | 939 | Comprobamos que los cambios se hayan realizado en la tabla. 940 | 941 | ![foreign_key_9](src/foreign_key_9.jpg) 942 | 943 | ### Clase 16 Insercion y consulta de datos 944 | 945 | Vamos a insertar datos en la tabla estacion, para ello damos de nuevo click derecho en la tabla deseada, vamos al menu Scripts y después al apartado INSERT Script 946 | 947 | ![insert_](src/insert_1.jpg) 948 | 949 | Creamos dos INSERT 950 | 951 | ![insert_2](src/insert_2.jpg) 952 | 953 | ![insert_3](src/insert_3.jpg) 954 | 955 | ```sql 956 | INSERT INTO public.estacion( 957 | nombre, direccion) 958 | VALUES ('Estacion Centro', 'St #2'); 959 | ``` 960 | 961 | ```sql 962 | INSERT INTO public.estacion( 963 | nombre, direccion) 964 | VALUES ('Estacion Norte', 'St 00#2'); 965 | ``` 966 | 967 | Y verificamos que se hayan insertado los datos 968 | 969 | ![insert_4](src/insert_4.jpg) 970 | 971 | Insertamos la informacion de la tabla de trenes 972 | 973 | ![insert_5](src/insert_5.jpg) 974 | 975 | A continuación viene la parte interesante que es relacionar la informacion de las tablas tren y estacion en la tabla trayecto. 976 | 977 | ![insert_6](src/insert_6.jpg) 978 | 979 | En caso de querer agregar un tren o una estacion que no existe PGAdmin/la consola no informara acerca del tipo de error 980 | 981 | ![insert_7](src/insert_7.jpg) 982 | 983 | Finalmente borramos la informacion de la tabla tren para el primer id 984 | 985 | ![insert_8](src/insert_8.jpg) 986 | 987 | Ahora veamos el efecto en la tabla de trayectos 988 | 989 | ![insert_9](src/insert_9.jpg) 990 | 991 | Observamos que se elimino la informacion (por la acción CASCADE) del trayecto ya que se elimino el id (llave primaria) del tren, ahora una peculiaridad es que si creamos otro tren sin definir explícitamente el valor del id tendremos un tren id 2, y el id del trayecto también cambiara. 992 | 993 | ![insert_0](src/insert_0.jpg) 994 | 995 | ![insert_1](src/insert_1.jpg) 996 | 997 | ![insert_2](src/insert_2.jpg) 998 | 999 | ![insert_3](src/insert_3.jpg) 1000 | 1001 | Ahora que pasa si cambiamos el ID del tren? Eso lo logramos con el comando UPDATE o UPDATE Script de PGAdmin 1002 | 1003 | ![insert_4](src/insert_4.jpg) 1004 | 1005 | ![insert_5](src/insert_5.jpg) 1006 | 1007 | ### Clase 17 Insercion masiva de datos 1008 | 1009 | Para esta clase usaremos el servicios para generar datos y después hacer las consultas y los temas avanzados de este curso. 1010 | 1011 | El servicio es intuitivo, por lo que deben quedar los campos de la siguiente manera. 1012 | 1013 | ![insersion_masiva_1](src/insersion_masiva_1.jpg) 1014 | 1015 | Hacemos click en el botón download y descargamos el script SQL, lo abrimos en nuestro editor de texto, copiamos y pegamos en el Script insert de estacion. 1016 | 1017 | pero antes reiniciamos limpiamos las tablas 1018 | 1019 | ```sql 1020 | TRUNCATE estacion CASCADE; 1021 | TRUNCATE tren CASCADE; 1022 | TRUNCATE trayecto CASCADE; 1023 | TRUNCATE pasajero CASCADE; 1024 | TRUNCATE viaje CASCADE; 1025 | ``` 1026 | 1027 | y reiniciamos el serial el serial de las tablas 1028 | 1029 | ```sql 1030 | TRUNCATE TABLE tren, trayecto, viaje, estacion, pasajero RESTART IDENTITY; 1031 | ``` 1032 | 1033 | ![insersion_masiva_2](src/insersion_masiva_2.jpg) 1034 | 1035 | Ahora hacemos lo mismo para la tabla de trenes. 1036 | 1037 | ![insersion_masiva_3](src/insersion_masiva_3.jpg) 1038 | 1039 | ![insersion_masiva_4](src/insersion_masiva_4.jpg) 1040 | 1041 | ![insersion_masiva_5](src/insersion_masiva_5.jpg) 1042 | 1043 | ![insersion_masiva_6](src/insersion_masiva_6.jpg) 1044 | 1045 | Creamos la data para trayecto y para viaje 1046 | 1047 | ![insersion_masiva_7](src/insersion_masiva_7.jpg) 1048 | 1049 | ![insersion_masiva_8](src/insersion_masiva_8.jpg) 1050 | 1051 | ## Modulo 3 Generar consultas avanzadas 1052 | 1053 | ### Clase 18 Cruzar tablas: SQL JOIN 1054 | 1055 | Ya tenemos informacion en nuestra base de datos, ahora podemos implementar joins para unir las tablas y extraer informacion de valor, recordemos que los joins implementan toda la teoría de conjuntos, si vienes de un background con python los joins son iguales a los sets. 1056 | 1057 | Los siguientes son los tipos de joins 1058 | 1059 | - JOIN(INNER) 1060 | - LEFT(OUTER) 1061 | - RIGHT(OUTER) 1062 | - FULL OUTER 1063 | 1064 | ![tipos_join](src/tipos_join.jpg) 1065 | 1066 | lectura recomendada 1067 | 1068 | Consultas de la clase 1069 | 1070 | ```sql 1071 | -- Inner Join o join 1072 | select * from pasajero 1073 | join viaje on (viaje.id_pasajero = pasajero.id); 1074 | 1075 | -- que pasajeros no han tomado ningun viaje 1076 | select * from pasajero 1077 | LEFT JOIN viaje on (viaje.id_pasajero = pasajero.id) 1078 | WHERE viaje.id IS NULL; 1079 | ``` 1080 | 1081 | ![join_](src/join_1.jpg) 1082 | 1083 | ### Clase 19 Funciones Especiales Principales 1084 | 1085 | Postgres tiene una lista de funciones especiales que están diseñadas exclusivamente para ayudarte a desarrollar tu aplicación mucho mas rápido algunas de ellas son: 1086 | 1087 | - **ON CONFLICT DO:** Nos ayuda cuando queremos insertar o modificar los datos en una tabla que no podamos y justamente después hacemos la actualización correcta, es decir si queremos insertar un dato que ya existe un conflict do no permite hacer una actualización sobre el mismo dato. 1088 | 1089 | - **RETURNING:** Nos permite devolver todos los cambios que hemos hecho sobre la base de datos, es decir si hacemos un insert nos devuelve todos los datos que fueron insertados en la base de datos, y si hay un campo de tipo serial devuelve el valor asignado. 1090 | 1091 | - **LIKE/ALIKE:** nos sirve para hacer búsquedas al estilo de regex por ejemplo buscar nombres que comiencen con la letra o 1092 | 1093 | - **IS/IS NOT:** nos permite comparar dos tipos de datos que no sean estándar como numérico y alfanumérico sino que sean de tipo objeto o especiales como Null, en este podemos saber por ejemplo si un campo es nulo o no lo es. 1094 | 1095 | Veremos como hacer esto con PGAdmin. 1096 | 1097 | Primer Ejemplo: Insertar un dato en la tabla estacion con id = . 1098 | 1099 | **ON CONFLICT DO NOTHING**. 1100 | 1101 | ![funciones_especiales_1](src/funciones_especiales_1.jpg) 1102 | 1103 | ```SQL 1104 | INSERT INTO public.estacion( 1105 | id, nombre, direccion) 1106 | VALUES (, 'Nombre', 'Dire') 1107 | ON CONFLICT DO NOTHING; 1108 | ``` 1109 | 1110 | **ON CONFLICT (COLUMNA) DO UPDATE SET**. 1111 | 1112 | ![funciones_especiales_2](src/funciones_especiales_2.jpg) 1113 | 1114 | ```SQL 1115 | INSERT INTO public.estacion( 1116 | id, nombre, direccion) 1117 | VALUES (, 'Nombre', 'Dire') 1118 | ON CONFLICT(ID) DO UPDATE SET nombre = 'Nombre', direccion = 'Dire'; 1119 | ``` 1120 | 1121 | **RETURNING**. 1122 | 1123 | ![funciones_especiales_3](src/funciones_especiales_3.jpg) 1124 | 1125 | ```SQL 1126 | INSERT INTO public.estacion( 1127 | nombre, direccion) 1128 | VALUES ('RET', 'RETDRI') 1129 | RETURNING *; 1130 | ``` 1131 | 1132 | **LIKE**. 1133 | 1134 | ![funciones_especiales_4](src/funciones_especiales_4.jpg) 1135 | 1136 | ```SQL 1137 | SELECT nombre 1138 | FROM public.pasajero 1139 | WHERE nombre ILIKE 'o%'; 1140 | 1141 | -- % buscar 1 o cualquier valor 1142 | -- _ buscar solamente 1 1143 | -- I buscar mayus o minusc por igual 1144 | ``` 1145 | 1146 | ****IS/IS NOT:****. 1147 | 1148 | ![funciones_especiales_5](src/funciones_especiales_5.jpg) 1149 | 1150 | ```SQL 1151 | SELECT * 1152 | FROM public.tren 1153 | WHERE modelo is NULL; 1154 | ``` 1155 | 1156 | ### Clase 20 Funciones Especiales Avanzadas 1157 | 1158 | Funciones mas comunes en postgres: 1159 | 1160 | - **COALESCE:** permite comprar dos valores y retornar cual de los dos no es nulo 1161 | 1162 | - **NULLIF:** permite comparar dos valores y retorna Null si son iguales 1163 | 1164 | - **GREATEST:** permite comprar un arreglo de valores y retorna el mayor 1165 | 1166 | - **LEAST:** permite comprar un arreglo de valores y retorna el menor 1167 | 1168 | - **BLOQUES ANÓNIMOS:** permite ingresar condicionales dentro de una consulta de base de datos. 1169 | 1170 | **Ejemplo COALESCE**. 1171 | 1172 | Primero modificar tabla pasajero para tener un dato como nulo. 1173 | 1174 | ![funciones_especiales_6](src/funciones_especiales_6.jpg) 1175 | 1176 | ```sql 1177 | SELECT id, COALESCE(nombre, 'No Aplica') nombre, direccion_residencia, fecha_nacimiento 1178 | FROM public.pasajero WHERE id = 1; 1179 | ``` 1180 | 1181 | **Ejemplo NULLIF**. 1182 | 1183 | ![funciones_especiales_7](src/funciones_especiales_7.jpg) 1184 | 1185 | ```sql 1186 | SELECT NULLIF (0,0); 1187 | ``` 1188 | 1189 | **Ejemplo GREATEST**. 1190 | 1191 | ![funciones_especiales_8](src/funciones_especiales_8.jpg) 1192 | 1193 | ```sql 1194 | SELECT GREATEST (0, 1,2,3,4,5,6);; 1195 | ``` 1196 | 1197 | **Ejemplo LEAST**. 1198 | 1199 | ![funciones_especiales_9](src/funciones_especiales_9.jpg) 1200 | 1201 | ```sql 1202 | SELECT LEAST (0, 1,2,3,4,5,6);; 1203 | ``` 1204 | 1205 | **Ejemplo BLOQUES ANÓNIMOS**. 1206 | 1207 | ![funciones_especiales_10](src/funciones_especiales_10.jpg) 1208 | 1209 | ```sql 1210 | SELECT id, nombre, direccion_residencia, fecha_nacimiento, 1211 | CASE --inicia bloque anónimo 1212 | WHEN fecha_nacimiento > '2015-01-01' THEN 1213 | 'niño' 1214 | ELSE 1215 | 'Mayor' 1216 | END --termina bloque anónimo 1217 | FROM public.pasajero; 1218 | ``` 1219 | 1220 | **Reto:** Consultar la informacion de los pasajeros agregando una columna adicional que nos diga quienes comienzan su nombre por la letra O y tiene mas de 18 años. 1221 | 1222 | ```sql 1223 | SELECT id, nombre, direccion_residencia, fecha_nacimiento, 1224 | CASE 1225 | --inicia bloque anónimo 1226 | WHEN nombre ILIKE 'o%' THEN '1' 1227 | ELSE '0' 1228 | END as nombre_inicia_o, 1229 | --termina bloque anónimo 1230 | CASE 1231 | --inicia bloque anónimo 1232 | WHEN EXTRACT(YEAR FROM current_date)- EXTRACT(YEAR FROM fecha_nacimiento) <= 18 THEN 1233 | 'Mayor de 18 años' 1234 | ELSE 1235 | 'Menor de 18 años' 1236 | END as Mayoria_de_edad 1237 | --termina bloque anónimo 1238 | FROM public.pasajero; 1239 | ``` 1240 | 1241 | ### Clase 21 Vistas 1242 | 1243 | Cuando necesitamos extraer la informacion de una base de datos en forma de consulta muchas veces como por ejemplo para generar reportes es conveniente utilizar las vistas, existen dos tipos. 1244 | 1245 | - Vista: Volátil (trae informacion reciente) 1246 | 1247 | - Vista Materializada: Persistente (trae informacion de memoria con la ultima consulta histórica) 1248 | 1249 | Cuando la construimos usaremos la sintaxis SELECT vista 1250 | 1251 | #### Vista volatil 1252 | 1253 | Creamos la vista en PGAdmin dando click derecho en views y luego en create 1254 | 1255 | ![views_1](src/views_1.jpg) 1256 | 1257 | ![views_2](src/views_2.jpg) 1258 | 1259 | ```sql 1260 | SELECT *, 1261 | CASE 1262 | WHEN fecha_nacimiento > '2015-01-01' THEN 1263 | 'Mayor' 1264 | ELSE 1265 | 'niño' 1266 | END as tipo 1267 | FROM public.pasajero 1268 | ORDER BY tipo; 1269 | ``` 1270 | 1271 | ![views_3](src/views_3.jpg) 1272 | 1273 | Guardamos la vista y ahora hacemos la consulta 1274 | 1275 | ![views_4](src/views_4.jpg) 1276 | 1277 | Estas vistas volatiles son muy útiles ya que podemos pasar la consulta raw (haciendo referencia a django) a nuestro backend para entregar el estado actual de los datos de nuestra aplicación. 1278 | 1279 | #### Vista Materializada 1280 | 1281 | Para ello hacemos click derecho en Materialized Views y seguimos los pasos del ejemplo anterior. 1282 | 1283 | ```sql 1284 | SELECT * from viaje WHERE inicio > '2020-01-01'; 1285 | ``` 1286 | 1287 | Nota: El ejemplo del curso utiliza horas, en mi caso particular utilice fechas. 1288 | 1289 | Hacemos la consulta 1290 | 1291 | ![views_5](src/views_5.jpg) 1292 | 1293 | Y observamos el error de que la vista no cuenta con datos, por lo que procedemos a aplicar la sentencia recomendada. 1294 | 1295 | ![views_6](src/views_6.jpg) 1296 | 1297 | Si borramos algún registro de nuestra tabla de viaje (29 al inicio 28 al borrar) la vista materializada seguirá conteniendo el total original (29 registros), estas vistas las usamos cuando queremos obtener la informacion 1 vez, esta quedara guardada en memoria. 1298 | 1299 | ### Clase 22 PL/SQL 1300 | 1301 | Las PL o procedimientos almacenados hacen parte del motor de postgres y es una de las caracteristicas mas importantes y el porque las personas empiezan a usar este motor, ella nos ayuda a desarrollar código directamente sobre la base su estructura es bastante sencilla, se asemeja a una funcion de cualquier lenguaje de programación (declaración, uso de variables y un fin) y se permite ejecutar dentro de la base de datos. 1302 | 1303 | ![pl_1](src/pl_1.jpg) 1304 | 1305 | #### Creando funciones con PL 1306 | 1307 | El primer ejemplo declara una PL nota que todas las PL inician con DO $$ y terminan con $$, este ejemplo levanta un mensaje solamente en la consola, esto con el keyword **RAISE NOTICE** 1308 | 1309 | ![pl_2](src/pl_2.jpg) 1310 | 1311 | Segundo ejemplo usando variables y tipos de datos, esto se hace con la seccion **DECLARE**, **record** nos permite almacenar el tipo de dato de una fila, y si queremos un valor de inicio lo hacemos con ":=" en el lenguaje de postgres y "=" solo esta reservado para las consultas. 1312 | 1313 | ![pl_3](src/pl_3.jpg) 1314 | 1315 | Ahora contaremos los registros en la tabla incorporando un contador 1316 | 1317 | ![pl_4](src/pl_4.jpg) 1318 | 1319 | Como te habrás dado cuenta no es posible llamar a este PL de esta manera, para ello es necesario encapsularlo de la siguiente forma. 1320 | 1321 | ![pl_5](src/pl_5.jpg) 1322 | 1323 | Void indica que no retorna valores, para ejecutar nuestra funcion basta con usar lo siguiente 1324 | 1325 | ```sql 1326 | SELECT importantePL(); 1327 | ``` 1328 | 1329 | ![pl_6](src/pl_6.jpg) 1330 | 1331 | No retorna ningun dato, pero si los mensajes de lo que ejecutamos. 1332 | 1333 | ![pl_7](src/pl_7.jpg) 1334 | 1335 | Si queremos retornar algún dato lo podemos declarar después de **RETURNS** y muy importante como nuestra funcion ya existe debemos hacer uno de la expresión **CREATE OR REPLACE FUNCTION** para nuestra funcion importantePL() 1336 | 1337 | ![pl_8](src/pl_8.jpg) 1338 | 1339 | **tip: La mayoria de las PL tienen que ver con consultas**. 1340 | 1341 | #### Creando funciones con PGAdmin 1342 | 1343 | Al igual que los demás ejercicios en el arbol del menu damos click derecho en functions y después en CREATE 1344 | 1345 | Nombramos a nuestra funcion 1346 | 1347 | ![pl_9](src/pl_9.jpg) 1348 | 1349 | ![pl_10](src/pl_10.jpg) 1350 | 1351 | ![pl_11](src/pl_11.jpg) 1352 | 1353 | ![pl_12](src/pl_12.jpg) 1354 | 1355 | Guardamos la PL y la ejecutamos igual que la forma anterior a traves del select. 1356 | 1357 | ![pl_13](src/pl_13.jpg) 1358 | 1359 | ![pl_14](src/pl_14.jpg) 1360 | 1361 | ### Clase 23 Triggers 1362 | 1363 | Los Triggers son herramientas muy útiles que nos permiten ejecutar funciones dependiendo de acciones que se ejecuten sobre una tabla, esa acciones pueden ser: 1364 | 1365 | - INSERT 1366 | - UPDATE 1367 | - DELETE 1368 | 1369 | Veremos con PGAdmin como concatenar nuestra pl a una funcion de INSERT, UPDATE O DELETE de la tabla de pasajeros. 1370 | 1371 | Crearemos ua bitacora que nos apoye a la clase, para ello haremos una tabla de nombre "cont_pasajero" con dos columnas "total" con valor integer y "tiempo" en formato time with time zone y una pk de nombre id (si tienes dudas revisa la primer seccion de las notas). 1372 | 1373 | Ahora la tabla la modificaremos unicamente con la PL que acabamos de crear. 1374 | 1375 | Primero modificamos la ultima PL en las propiedades/code 1376 | 1377 | ```sql 1378 | DECLARE 1379 | rec record; 1380 | contador integer := 0; 1381 | BEGIN 1382 | FOR rec IN SELECT * FROM pasajero LOOP 1383 | -- accedes con dot notation a las propiedades de la variable rec 1384 | RAISE NOTICE 'Un pasajero se llama % con el id %', rec.nombre, rec.id; 1385 | contador := contador + 1; 1386 | END LOOP; 1387 | INSERT INTO cont_pasajero (total,tiempo) 1388 | VALUES (contador, now()); 1389 | RETURN contador; 1390 | END 1391 | ``` 1392 | 1393 | Ejecutamos nuestra PL y traemos los datos de la ultima tabla creada 1394 | 1395 | ![trigger_1](src/trigger_1.jpg) 1396 | 1397 | Borramos un registro de la tabla de pasajeros, volvemos a ejecutar nuestro trigger y consultamos de nuevo los datos. 1398 | 1399 | ![trigger_2](src/trigger_2.jpg) 1400 | 1401 | Ahora vamos a hacer que esa funcion sea de tipo Trigger y la adjuntamos al insert de la tabla de pasajeros. 1402 | 1403 | Para ello modificamos la funcion, donde ahora deberá detornar un trigger, para ello borramos la funcion que teníamos y la volvemos a escribir. 1404 | 1405 | ![trigger_3](src/trigger_3.jpg) 1406 | 1407 | Ese trigger de cierta forma lo podemos adjuntar a las acciones sobre una tabla, las acciones compatibles son INSERT, UPDATE, DELETE Y TRUNCATE, para este ejemplo vamos a hacerlo sobre el nivel de INSERT para ello creamos la funcion CREATE TRIGGER 1408 | 1409 | ![trigger_4](src/trigger_4.jpg) 1410 | 1411 | Intentamos hacer un insert a pasajeros. 1412 | 1413 | ![trigger_5](src/trigger_5.jpg) 1414 | 1415 | Observamos en el error que el trigger no esta retornando nada, por lo que hay que modificarlo en el apartado del arbol triggers lo buscamos y damos click en CREATE y modificamos el trigger. 1416 | 1417 | Un trigger contiene informacion de lo que se esta cambiando debemos confirmar al motor de la base de datos si el cambio se esta llevando a cabo o no. 1418 | 1419 | Los triggers tiene dos variables globales muy importantes **OLD** lo que estaba antes del cambio y **NEW** lo que esta después del cambio, si queremos que el trigger proceda con el nuevo valor usamos NEW, si queremos quedarnos como estábamos usamos OLD, al igual que la variable rec también podemos acceder a las propiedades con dot notation asi tendremos OLD.id o NEW.nombre donde se almacenan los cambios en el estado, estas tienen mucho sentido cuando hacemos un UPDATE, pero para insert lo adecuado siempre sera NEW. 1420 | 1421 | Seguiremos los siguientes pasos 1422 | 1423 | 1 Borramos el Trigger 1424 | 1425 | 2.- Borramos la funcion en CASCADE para eliminar el disparador también. 1426 | 1427 | ```sql 1428 | DROP FUNCTION public.importante_pl2() CASCADE ; 1429 | ``` 1430 | 1431 | 3.- Creamos el trigger 1432 | 1433 | ![trigger_6](src/trigger_6.jpg) 1434 | 1435 | ```sql 1436 | 1437 | CREATE FUNCTION public.importante_pl2() 1438 | RETURNS trigger 1439 | LANGUAGE 'plpgsql' 1440 | COST 100 1441 | VOLATILE NOT LEAKPROOF 1442 | AS $BODY$ 1443 | DECLARE 1444 | rec record; 1445 | contador integer := 0; 1446 | BEGIN 1447 | FOR rec IN SELECT * FROM pasajero LOOP 1448 | contador := contador + 1; 1449 | END LOOP; 1450 | INSERT INTO cont_pasajero (total,tiempo) 1451 | VALUES (contador, now()); 1452 | RETURN NEW; 1453 | END 1454 | $BODY$; 1455 | ``` 1456 | 1457 | 4.- Creamos el Trigger 1458 | 1459 | ![trigger_7](src/trigger_7.jpg) 1460 | 1461 | Ahora procedemos de nuevo a insertar un valor nuevo en la tabla pasajero 1462 | 1463 | ![trigger_8](src/trigger_8.jpg) 1464 | 1465 | Consultamos la tabla cont_pasajeros para confirmar 1466 | 1467 | ![trigger_9](src/trigger_9.jpg) 1468 | 1469 | **Reto:** Crear un trigger similar al anterior donde se registre cuando se eliminan los pasajeros 1470 | 1471 | **Solución**. 1472 | 1473 | Funcion pl_on_delete_pasajero 1474 | 1475 | ```sql 1476 | CREATE FUNCTION public.pl_on_delete_pasajero() 1477 | RETURNS trigger 1478 | LANGUAGE 'plpgsql' 1479 | 1480 | AS $BODY$ 1481 | DECLARE 1482 | rec record; 1483 | contador integer := 0; 1484 | BEGIN 1485 | FOR rec IN SELECT * FROM pasajero LOOP 1486 | contador := contador + 1; 1487 | END LOOP; 1488 | INSERT INTO cont_pasajero (total,tiempo) 1489 | VALUES (contador, now()); 1490 | RETURN NEW; 1491 | END 1492 | $BODY$; 1493 | ``` 1494 | 1495 | Se crea Trigger con la funcion, el nombre del trigger lo encuentras en los triggers de la tabla pasajero. 1496 | 1497 | ```sql 1498 | CREATE TRIGGER mitrigger_2 1499 | AFTER DELETE 1500 | ON public.pasajero 1501 | FOR EACH ROW 1502 | EXECUTE PROCEDURE pl_on_delete_pasajero(); 1503 | ``` 1504 | 1505 | Verificamos haciendo el DELETE de cualquier usuario y observamos el resultado. 1506 | 1507 | ![trigger_10](src/trigger_10.jpg) 1508 | 1509 | ## Modulo 4 Integrar bases de datos con servicios externos 1510 | 1511 | ### Clase 24 Simulando una conexion a Bases de Datos remotas 1512 | 1513 | Postgres ofrece un servicio llamado **dblink**, permite conectarte a servidores remotos dentro de una consulta, en el cual puedes hacer **SELECT** una tabla local y hacer incluso un **JOIN** a una base de datos remota. 1514 | 1515 | Para ello crearemos una base de datos en nuestro propio servidor simulando que sea una base de datos remota siguiendo los pasos que ya conocemos y la denominamos como "remota" con una tabla llamada vip, esta tendra dos columnas ID (serial) y Fecha (date), finalmente le damos todos los permisos al usuario que se conectara a la base de datos en forma remota en este caso nuestro **usuario_consulta**. 1516 | 1517 | Insertamos un par de datos para probar. 1518 | 1519 | ```sql 1520 | INSERT INTO public.vip( 1521 | id, fecha) 1522 | VALUES (50, '2010-01-01'); 1523 | ``` 1524 | 1525 | Y nos desconectamos de esa base de datos para conectarnos después desde la tabla pasajero de la base de datos transporte. 1526 | 1527 | Antes de todo verificamos tener instalado dblink 1528 | 1529 | ```sql 1530 | SELECT * FROM 1531 | dblink ('dbname=remota 1532 | port=5432 1533 | host=127.0.0.1 1534 | user=usuario_consulta 1535 | password=etc123' 1536 | 'SELECT id, fecha FROM vip') 1537 | ``` 1538 | 1539 | Al ejecutar obtendremos un error si no tenemos instalado db link, lo instalamos con lo siguiente 1540 | 1541 | ```sql 1542 | CREATE EXTENSION dblink; 1543 | ``` 1544 | 1545 | Volvemos a intentar la conexion. 1546 | 1547 | ![datos_remotos_1](src/datos_remotos_1.jpg) 1548 | 1549 | Ya obtuvimos acceso remoto a una base de datos, ahora hagamos un join de nuestros datos locales para saber quien es el usuario VIP 1550 | 1551 | ```sql 1552 | SELECT * FROM pasajero 1553 | JOIN 1554 | dblink ('dbname=remota 1555 | port=5432 1556 | host=127.0.0.1 1557 | user=usuario_consulta 1558 | password=etc123', 1559 | 'SELECT id, fecha FROM vip' 1560 | ) as datos_remotos (id integer, fecha date) 1561 | ON (pasajero.id = datos_remotos.id); 1562 | ``` 1563 | 1564 | Usamos **USING** cuando los dos campos de una consulta **JOIN** son iguales, esto es especial de las consultas esto nos devuelve la misma informacion de la tabla 1565 | 1566 | ```sql 1567 | SELECT * FROM pasajero 1568 | JOIN 1569 | dblink ('dbname=remota 1570 | port=5432 1571 | host=127.0.0.1 1572 | user=usuario_consulta 1573 | password=etc123', 1574 | 'SELECT id, fecha FROM vip' 1575 | ) as datos_remotos (id integer, fecha date) 1576 | -- ON (pasajero = datos_remotos) 1577 | USING (id); 1578 | ``` 1579 | 1580 | ![datos_remotos_2](src/datos_remotos_2.jpg) 1581 | 1582 | **Reto** Haz la conexion de forma inversa. 1583 | 1584 | **Solución**. 1585 | 1586 | ```sql 1587 | SELECT * FROM vip 1588 | JOIN 1589 | dblink ('dbname=transporte 1590 | port=5432 1591 | host=127.0.0.1 1592 | user=usuario_consulta 1593 | password=etc123', 1594 | 'SELECT id, nombre, direccion_residencia, fecha_nacimiento FROM pasajero' 1595 | ) as datos_remotos (id integer, 1596 | nombre character varying, 1597 | direccion_residencia character varying, 1598 | fecha_nacimiento date) 1599 | -- ON (vip.id = datos_remotos.id) 1600 | USING (id) 1601 | ; 1602 | ``` 1603 | 1604 | ![datos_remotos_3](src/datos_remotos_3.jpg) 1605 | 1606 | ### Clase 25 Transacciones 1607 | 1608 | Tomando el ejemplo de un cajero automático, cuando uno de sus procesos falla este debe devolver todos los cambios, postgres hace lo mismo, cuando tiene un proceso si alguna de las tareas que lo componen falla este debe poder devolver todos los cambios automáticamente (hacer un rollback) 1609 | 1610 | El proceso se ilustra como 1611 | 1612 | ```md 1613 | 1614 | BEGIN 1615 | 1616 | COMMIT (si todo salio bien) | ROLLBACK (si algo salio mal) 1617 | ``` 1618 | 1619 | En PGAdmin primero desactivamos el auto commit, este viene activo por default, y ejecutamos las siguientes consultas iniciando con **BEGIN** 1620 | 1621 | ![transacciones_1](src/transacciones_1.jpg) 1622 | 1623 | Como puedes observar (y marcado con un recuadro naranja) en la interfaz de PGAdmin aparecieron 2 botones "commit" y "rollback" si damos commit deben guardarse los datos, y en el caso opuesto deshacer la transacción, pero como esta es una consulta esto no afecta a la base de datos. 1624 | 1625 | Ahora probemos que pasa con un insert creando una nueva estacion. 1626 | 1627 | ![transacciones_2](src/transacciones_2.jpg) 1628 | 1629 | En este punto la informacion esta almacenada en memoria, si quitamos el comentario de algunas de las opciones (no es necesario ejecutar los inserts ya que los datos están en staging) y ejecutamos esa linea se confirmaran o devolverán los cambios, también lo puedes hacer en forma manual con los botones de la interface, aceptamos los cambios y comprobamos la informacion insertada. 1630 | 1631 | ![transacciones_3](src/transacciones_3.jpg) 1632 | 1633 | ![transacciones_4](src/transacciones_4.jpg) 1634 | 1635 | Hasta ahora todos los datos han sido correctos y el commit se ejecuta sin problemas, ahora haremos un ejemplo usando un id que se encuentra repetido usando un INSERT. 1636 | 1637 | ![transacciones_5](src/transacciones_5.jpg) 1638 | 1639 | Al ejecutar los inserts dentro del bloque de código **BEGIN / COMMIT** nos aseguramos que todas las operaciones sean congruentes, si hubiésemos ejecutado las sentencias con la selección la primera se habría ejecutado y guardado, y la segunda hubiera fallado, pero al estar dentro del bloque de transacción con una consulta que sea errónea se hace el **ROLLBACK** y no se guarda ninguna informacion en la base de datos, ya que postgres siempre lo hace de manera implícita sin mostrarlo en pantalla, una forma explicita seria usándolo con las PL para limitar el numero de vip's en nuestros servicios. 1640 | 1641 | ![transacciones_6](src/transacciones_6.jpg) 1642 | 1643 | ### Clase 26 Otras Extensiones para Postgres 1644 | 1645 | Postgres tiene muchas extensiones pre-instaladas pero no activas en tu sistema operativo, y estas te sirven para hacer cálculos, análisis, prototipado inclusive para machine learning. 1646 | 1647 | Activaremos una funcion que te permite comprar dos palabras letra por letra y como suenan cuando se pronuncian en Ingles, todo usando PGAdmin. 1648 | 1649 | Aquí todas las extensiones disponibles 1650 | 1651 | Vamos a PGAdmin para instalar leveshtein (la funcion matemática para medir la distancia entre dos palabras) 1652 | 1653 | **Levenshtein**. 1654 | 1655 | ![extensiones_1](src/extensiones_1.jpg) 1656 | 1657 | Vemos el resultado es 1, es decir el numero de caracteres que es necesario cambiar para que ambas palabras sean iguales. 1658 | 1659 | **Difference**. 1660 | 1661 | Esta funcion es utilizada junto con algoritmos de machine learning y procesamiento de lenguaje natural el cual sabe que palabra quisiste decir, nos entrega un valor entre 0 y 4 donde 0 diferencia amplia. 1662 | 1663 | ![extensiones_2](src/extensiones_2.jpg) 1664 | 1665 | Estas dos funciones si nuestra aplicaciones implementan análisis de texto o análisis de voz no es necesario desarrollarlas desde cero ya que postgres lo implementa al nivel de la base de datos. 1666 | 1667 | ## Modulo 5 Implementar mejores prácticas 1668 | 1669 | ### Clase 26 Backups y Restauracion 1670 | 1671 | Ha llegado el momento de guardar todo nuestro trabajo hasta el momento y tener una copia de seguridad en caso de que algo catastrófico ocurra, para eso Postgres tiene los servicios de restauracion, usaremos los siguientes comandos 1672 | 1673 | - pg_dump 1674 | - pg_restore[psql] 1675 | 1676 | Tenemos nuestra base de datos con mucha informacion delicada, y vamos a crear una copia de seguridad, para ello vamos en PGAdmin a nuestra base de datos **"transporte"** haciendo click derecho y seleccionamos la opcion Backup... y se abrirá un formulario para preguntarnos que es lo que queremos hacer. 1677 | 1678 | ![backup_1](src/backup_1.jpg) 1679 | 1680 | Tenemos los siguientes campos: 1681 | 1682 | - **Filename:** Para indicar el nombre de tu archivo y el icono con tres puntos nos abre una ventana para seleccionar el directorio donde queremos guardar la el backup 1683 | 1684 | - **Format:** Este tiene 4 opciones. 1685 | - custom: Solo se puede usar con PGAdmin. 1686 | - Tar: archivo comprimido .tar que contienen la estructura de la base de datos. 1687 | - plain: sql plano, tendrás toda la informacion como una gran query con las sentencias (create table, insert, etc) y los datos. 1688 | - Directory: tiene la estructura sin comprimir de la base de datos. 1689 | 1690 | - **Compression ratio:** el numero de veces que se ejecuta el ciclo de compresión para que quede un archivo mas pequeño. 1691 | 1692 | - **Encoding:** La codificación de la base de datos por ejemplo UTF-8. 1693 | 1694 | - **Number of jobs:** no lo podemos modificar, lo define PGAdmin. 1695 | 1696 | - Role name: Dueño de quien sera el DUMP. 1697 | 1698 | En la pantalla de opciones podemos solicitar la data y el schema, o solo uno de ellos, los blobs se refiere a los datos de tipos binarios (imagen o archivo de texto), haz click en el símbolo ? para ver a detalle cada una de las opciones. 1699 | 1700 | ![backup_2](src/backup_2.jpg) 1701 | 1702 | ![backup_3](src/backup_3.jpg) 1703 | 1704 | Ahora para realizar el paso de Restauracion creamos una base de datos nueva (simulando que ya no existe la base transporte), damos click derecho y seleccionamos la opcion de Restore. 1705 | 1706 | ![backup_4](src/backup_4.jpg) 1707 | 1708 | Con ello recuperamos nuestras tablas y la informacion que estas contenían. 1709 | 1710 | **Nota:** es importante resaltar que cuando se hace un backup para ser restaurado en una versión diferente se debe de usar la opción plana dado que el custom varia de versión a versión. 1711 | 1712 | Como hacer backup desde la consola 1713 | 1714 | Crear un fichero con las sentencias SQL listas para cargar el contenido de 1715 | una db en otra db distinta (modo simple) 1716 | 1717 | ```sql 1718 | postgres=# pg_dump source_db_name > db_data.sql 1719 | ``` 1720 | 1721 | Cargar un fichero con las sentencias SQL listas de una db en otra db 1722 | nueva y distinta (modo simple) 1723 | 1724 | ```sql 1725 | postgres=# psql -d new_db_name -f db_data.sql 1726 | ``` 1727 | 1728 | Otras opciones disponibles: 1729 | 1730 | ```sql 1731 | postgres=#\q 1732 | ...$ psql --help 1733 | ``` 1734 | 1735 | ### Clase 29 Mantenimiento 1736 | 1737 | Este es un tema importante y que postgres realiza por debajo en segundo plano, en este proceso de vacuum (vaciado) quita todas las filas, columnas e items del disco duro que no están funcionando para optimizar los servicios. 1738 | 1739 | Postgres tiene dos niveles de limpieza. 1740 | 1741 | - Liviano: se ejecuta todo el tiempo para lograr las optimizaciones descritas anteriormente. 1742 | 1743 | - Completo (full): que es capaz de bloquear las tablas para hacer la limpieza y luego las desbloquea, es importante cuando tenemos una tabla muy grande y tenemos problemas de indexacion. 1744 | 1745 | El mantenimiento en PGAdmin lo llevamos a cabo dando click derecho sobre la base de datos o sobre una de las tablas, pero es muy diferente ya que solo afectamos una tabla, mientras a nivel de base de datos podemos llegar a bloquear todas las tablas hasta que la tarea de mantenimiento termine, este es su menu con sus caracteristicas, la mas importante es vacuum. 1746 | 1747 | ![maintenance_1](src/maintenance_1.jpg) 1748 | 1749 | - Full: quiere decir que la tabla que vas a limpiar (en este caso estacion) quedara limpia en su totalidad, es decir se realizara la revision de todo el espacio en memoria para que todas las filas que ya no son aplicables se eliminen y todos los indices también. 1750 | 1751 | - Freeze: incluye que durante ese proceso se va a congelar, pero hay que tener en cuenta que un cuando se hace un vacuum full si no es posible hacerlo en lo que llega una consulta nueva esa tabla queda congelada y tendra un lot quiere decir que ninguna tabla podrá acceder a ella hasta que termine el proceso de limpieza. 1752 | 1753 | - Analyze: ejecuta una revision pero no hace cambios en la tabla. 1754 | 1755 | - Verbose Messages. Nos da el feedback de lo que esta sucediendo. 1756 | 1757 | - Reindex: aplica para tablas que tienen indices, entre ellos las llaves primarias, que los motores crean como indices porque son normalmente usados para búsquedas. 1758 | 1759 | - Custer: es decirle al motor de la base de datos que reorganice la el almacenamiento. 1760 | 1761 | Estas 4 opciones no es recomendable hacerlo a mano ya que postgres tiene mas de 20 años optimizando estos procesos, aunque eventualmente si puede llegar a ser necesario hacerlo hazlo en un horario que no afecte a tus usuarios o servicios. 1762 | 1763 | ### Clase 29 Introduccion a Replicas 1764 | 1765 | Las replicas son mecanismos que nos permiten evitar problemas de entrada y salida en los sistemas operativos. 1766 | 1767 | Ten en cuenta esta frase. 1768 | 1769 | ![replicas_1](src/replicas_1.jpg) 1770 | 1771 | Cuando tu aplicación crece en usuarios/operaciones te vas a topar con limites en términos de física y electronica, es decir los recursos de tu servidor (disco, ram, cpu) tienen limites, ellos no pueden ser sobrepasados en sus procesos de lectura y escritura que no pueden llevarse al mismo tiempo, por este motivo postgres bloquea la tabla para escritura mientras la lees y viceversa, esto para conservar la consistencia de datos, aquí entran las replicas a solucionar este problema. 1772 | 1773 | **Estrategia de Replicas**. 1774 | 1775 | Tendremos la base de datos principal se hacen todas las modificaciones y tener una base de datos secundaria donde solamente se hacen las lecturas, separa las acciones nos permite separar todas las tareas que hace internamente postgres es decir los cambios los hace en "A" y automáticamente se llevan a la tabla donde se leen los datos "B", este proceso lo hace postgres no tiene que hacer nada a mano, solamente es necesario configurar al menos 2 servidores de postgres (por lo menos 2, ya que puedes tener una cantidad ilimitada de replicas) uno como maestro y otro como esclavo, deberás modificar tu aplicación para que todas las modificaciones las haga sobre la base de datos principal o "master" y que todas las lecturas las haga sobre la replica (copia en caliente de la base de datos). 1776 | 1777 | IPS (In operation per second) es la limitante a nivel de sistemas operativos, como saber que nivel nos sirve (10,20, 40 iops) 1778 | 1779 | ### Clase 30 Implementacion de Replicas en Postgres 1780 | 1781 | Usaremos la plataforma para crear dos servidores 1 de postgres que sera el maestro y 1 en postgres que sera el esclavo/replica, jelastic es un SaaS 1782 | 1783 | Primero nos registramos aquí , nos registramos y creamos dos bases de datos hacemos lo mismo para master1 y replica1. 1784 | 1785 | ![replicas_2](src/replicas_2.jpg) 1786 | 1787 | Esperamos a que termine su proceso y recibiremos por email los datos de conexion para usar en PAAdmin donde crearemos un servidor como los locales, lo nombramos master, pero en los datos de host y password utilizaremos los datos que recibimos por correo ya que IPV4 ya no esta disponible en la version trial, para la parte del nodo debemos ir al servicio de jelastic y dar click en el engrane amarillo a la altura de la base de datos y configurar un endpoint y reemplazar ese dato en el puerto. 1788 | 1789 | Datos del correo 1790 | 1791 | ![replicas_3](src/replicas_3.jpg) 1792 | 1793 | Configurar endpoint 1794 | 1795 | ![replicas_4](src/replicas_4.jpg) 1796 | 1797 | **Aquí ATENTO es muy importante que selecciones el nodo de tu base de datos** (tuve el error de seleccionar el nodo del server y nunca me conecte) la imagen es solo referencia, el nodo lo encuentras en el apartado con el icono de Postgres. 1798 | 1799 | ![replicas_5](src/replicas_5.jpg) 1800 | 1801 | Después de hacer clic en ADD nos asigna el Port que Podemos usar para accede a la BD usando el host en forma de nombre de dominio y no IP, en éste caso fué 11031. 1802 | 1803 | ![replicas_6](src/replicas_6.jpg) 1804 | 1805 | Este proceso lo realizamos también para la base replica, bien ahora contamos con dos bases de datos independientes. 1806 | 1807 | ![replicas_7](src/replicas_7.jpg) 1808 | 1809 | #### Configuracion Master 1810 | 1811 | Ahora vamos a configurar ambas bases de datos, una como maestro y la otra como esclavo. 1812 | 1813 | Primero vamos a configurar master, aplicaremos cambios al archivo **postgresql.conf** cambiando varios parámetros para que entienda que va a ser una base de datos de replica y que va a recibir conexiones desde otra base de datos para copiar informacion. 1814 | 1815 | Buscamos los siguientes campos 1816 | 1817 | - **wal_level**(wall ahead log) que es como la bitacora de la base de datos, lo establecemos en para que se comporte en modo **hot_standby**, es decir una base de datos que mantiene sus archivos hasta que sus replicas se las lleven y los ejecuten.**Básicamente las replicas funcionan leyendo estos archivos de bitacora y copiando la informacion para no bloquear la base de datos maestra;** 1818 | 1819 | ![replicas_8](src/replicas_8.jpg) 1820 | 1821 | Buscamos el parámetro **max_wal_senders** que corresponde a la cantidad de replicas que vamos a tener, lo dejamos como 2 a futuro. 1822 | 1823 | ![replicas_9](src/replicas_9.jpg) 1824 | 1825 | Siguiente parámetro es **archive_mode** y refiere a como vamos a guardar los archivos de esa bitacora, indica que no los vamos a eliminar sino simplemente a archivar, lo dejamos en **on** para que als copias de replica las puedan leer desde ahi. 1826 | 1827 | ![replicas_10](src/replicas_10.jpg) 1828 | 1829 | Por ultimo para master tenemos **archive_command**, le indicamos con un comando de linux que es para copiar archivos y dejarlos en una carpeta temporal **'cp %p /tmp/%f'** 1830 | 1831 | ![replicas_11](src/replicas_11.jpg) 1832 | 1833 | Con esto tenemos la configuracion principal en nuestra base de datos maestra, ahora reiniciamos el servicio, pero antes recuerdas que existe en un archivo para permitir la conexion remota entre servicios **pg_hba.cong**, agregaremos la siguiente configuracion para un host con intenciones de replicacion con todas las bases de datos se va a conectar desde una Ip y confiarle lo que haga sin contraseña (solo para estos efectos de practica, y usaremos la IP interna de la replica) y le ponemos la mascara 32 para que sepa que no es un rango de ips sino una sola ip 1834 | 1835 | ![replicas_13](src/replicas_13.jpg) 1836 | 1837 | Ahora reiniciamos el nodo de postgres. 1838 | 1839 | #### Configuracion Replica 1840 | 1841 | Procedemos a los cambios para ello haremos un par de ajustes en el archivo.conf lo primero es copiar todo lo que esta en master, nos conectamos con shh en el icono de terminal 1842 | 1843 | ![replicas_14](src/replicas_14.jpg) 1844 | 1845 | Ejecutamos el siguiente comando para detener el servicio de replica y hacer la copia de seguridad de los archivos directamente de la master hacia la esclava, con esto tendremos a las dos en un estado idéntico y posterior la reiniciamos en modo replica 1846 | 1847 | Detenemos el servicio 1848 | 1849 | ```bash 1850 | sudo service postgresql stop 1851 | ``` 1852 | 1853 | Borramos los datos existentes 1854 | 1855 | ```bash 1856 | rm -rf /var/lib/pgsql/data/* 1857 | ``` 1858 | 1859 | Copiamos los datos de por conexion remota 1860 | 1861 | ```bash 1862 | pg_basebackup -U webadmin -R -D /var/lib/pgsql/data/ --host=192.168.6.255 --port=5432 1863 | ``` 1864 | 1865 | Ahora hacemos un cambio en la en el archivo **postgresql.conf** de la base de datos replica al parámetro **hot_standby** lo indicamos en **on** 1866 | 1867 | ![replicas_15](src/replicas_15.jpg) 1868 | 1869 | Ahora reiniciamos el servicio 1870 | 1871 | ```bash 1872 | sudo service postgresql start 1873 | ``` 1874 | 1875 | Ahora lo interesante, comprobamos la configuracion maestro/replica, pero primero debes actualizar la contraseña de replica que ahora es la de master dado que clonamos sus datos, ahora si podemos acceder dado que tenemos una misma configuracion. 1876 | 1877 | Creamos una base de datos en master 1878 | 1879 | ![replicas_16](src/replicas_16.jpg) 1880 | 1881 | Unos segundos después y de manera automática, ya la tengo en replica 1882 | 1883 | ![replicas_17](src/replicas_17.jpg) 1884 | 1885 | Pero si nosotros intentamos escribir en replica no nos va a dejar ya que replica es solo de lectura. 1886 | 1887 | ### Clase 31 Otras buenas Practicas 1888 | 1889 | **Problema:** Evitar bloqueos por inserciones y borrados en la misma tabla. 1890 | 1891 | **solución:** renombrar tablas, decirle a sistema que ataque dos tablas, ejemplo con un **ALTER TABLE** cambia la tabla **viajes** a **viajes_temporal** y crea una tabla de **viajes "nueva"** mientras que la aplicación sigue utilizando la tabla de viajes para insertar las operaciones del dia/turno, esto permitirá a tu algoritmo de consolidación realizar el borrado y indexado mucho mas rápido, mientras la tabla viajes sigue con registrando las operaciones de la aplicación, esta operación se realiza dependiendo el flujo de informacion a consolidar. -------------------------------------------------------------------------------- /Notes/src/backup_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/backup_1.jpg -------------------------------------------------------------------------------- /Notes/src/backup_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/backup_2.jpg -------------------------------------------------------------------------------- /Notes/src/backup_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/backup_3.jpg -------------------------------------------------------------------------------- /Notes/src/backup_4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/backup_4.jpg -------------------------------------------------------------------------------- /Notes/src/bd_proyecto.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/bd_proyecto.jpg -------------------------------------------------------------------------------- /Notes/src/comandos_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/comandos_1.jpg -------------------------------------------------------------------------------- /Notes/src/comandos_10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/comandos_10.jpg -------------------------------------------------------------------------------- /Notes/src/comandos_11.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/comandos_11.jpg -------------------------------------------------------------------------------- /Notes/src/comandos_12.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/comandos_12.jpg -------------------------------------------------------------------------------- /Notes/src/comandos_13.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/comandos_13.jpg -------------------------------------------------------------------------------- /Notes/src/comandos_14.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/comandos_14.jpg -------------------------------------------------------------------------------- /Notes/src/comandos_15.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/comandos_15.jpg -------------------------------------------------------------------------------- /Notes/src/comandos_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/comandos_2.jpg -------------------------------------------------------------------------------- /Notes/src/comandos_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/comandos_3.jpg -------------------------------------------------------------------------------- /Notes/src/comandos_4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/comandos_4.jpg -------------------------------------------------------------------------------- /Notes/src/comandos_5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/comandos_5.jpg -------------------------------------------------------------------------------- /Notes/src/comandos_6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/comandos_6.jpg -------------------------------------------------------------------------------- /Notes/src/comandos_7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/comandos_7.jpg -------------------------------------------------------------------------------- /Notes/src/comandos_8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/comandos_8.jpg -------------------------------------------------------------------------------- /Notes/src/comandos_9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/comandos_9.jpg -------------------------------------------------------------------------------- /Notes/src/create_table_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/create_table_1.jpg -------------------------------------------------------------------------------- /Notes/src/create_table_10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/create_table_10.jpg -------------------------------------------------------------------------------- /Notes/src/create_table_11.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/create_table_11.jpg -------------------------------------------------------------------------------- /Notes/src/create_table_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/create_table_2.jpg -------------------------------------------------------------------------------- /Notes/src/create_table_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/create_table_3.jpg -------------------------------------------------------------------------------- /Notes/src/create_table_4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/create_table_4.jpg -------------------------------------------------------------------------------- /Notes/src/create_table_5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/create_table_5.jpg -------------------------------------------------------------------------------- /Notes/src/create_table_6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/create_table_6.jpg -------------------------------------------------------------------------------- /Notes/src/create_table_7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/create_table_7.jpg -------------------------------------------------------------------------------- /Notes/src/create_table_8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/create_table_8.jpg -------------------------------------------------------------------------------- /Notes/src/create_table_9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/create_table_9.jpg -------------------------------------------------------------------------------- /Notes/src/create_user_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/create_user_1.jpg -------------------------------------------------------------------------------- /Notes/src/create_user_10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/create_user_10.jpg -------------------------------------------------------------------------------- /Notes/src/create_user_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/create_user_2.jpg -------------------------------------------------------------------------------- /Notes/src/create_user_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/create_user_3.jpg -------------------------------------------------------------------------------- /Notes/src/create_user_4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/create_user_4.jpg -------------------------------------------------------------------------------- /Notes/src/create_user_5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/create_user_5.jpg -------------------------------------------------------------------------------- /Notes/src/create_user_6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/create_user_6.jpg -------------------------------------------------------------------------------- /Notes/src/create_user_7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/create_user_7.jpg -------------------------------------------------------------------------------- /Notes/src/create_user_8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/create_user_8.jpg -------------------------------------------------------------------------------- /Notes/src/create_user_9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/create_user_9.jpg -------------------------------------------------------------------------------- /Notes/src/datos_remotos_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/datos_remotos_1.jpg -------------------------------------------------------------------------------- /Notes/src/datos_remotos_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/datos_remotos_2.jpg -------------------------------------------------------------------------------- /Notes/src/datos_remotos_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/datos_remotos_3.jpg -------------------------------------------------------------------------------- /Notes/src/diagrama_entidad_relacion_proyecto.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/diagrama_entidad_relacion_proyecto.jpg -------------------------------------------------------------------------------- /Notes/src/diagrama_entidad_relacion_proyecto_styled.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/diagrama_entidad_relacion_proyecto_styled.jpg -------------------------------------------------------------------------------- /Notes/src/extensiones_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/extensiones_1.jpg -------------------------------------------------------------------------------- /Notes/src/extensiones_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/extensiones_2.jpg -------------------------------------------------------------------------------- /Notes/src/foreign_key_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/foreign_key_1.jpg -------------------------------------------------------------------------------- /Notes/src/foreign_key_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/foreign_key_2.jpg -------------------------------------------------------------------------------- /Notes/src/foreign_key_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/foreign_key_3.jpg -------------------------------------------------------------------------------- /Notes/src/foreign_key_4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/foreign_key_4.jpg -------------------------------------------------------------------------------- /Notes/src/foreign_key_5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/foreign_key_5.jpg -------------------------------------------------------------------------------- /Notes/src/foreign_key_6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/foreign_key_6.jpg -------------------------------------------------------------------------------- /Notes/src/foreign_key_7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/foreign_key_7.jpg -------------------------------------------------------------------------------- /Notes/src/foreign_key_8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/foreign_key_8.jpg -------------------------------------------------------------------------------- /Notes/src/foreign_key_9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/foreign_key_9.jpg -------------------------------------------------------------------------------- /Notes/src/funciones_especiales_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/funciones_especiales_1.jpg -------------------------------------------------------------------------------- /Notes/src/funciones_especiales_10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/funciones_especiales_10.jpg -------------------------------------------------------------------------------- /Notes/src/funciones_especiales_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/funciones_especiales_2.jpg -------------------------------------------------------------------------------- /Notes/src/funciones_especiales_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/funciones_especiales_3.jpg -------------------------------------------------------------------------------- /Notes/src/funciones_especiales_4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/funciones_especiales_4.jpg -------------------------------------------------------------------------------- /Notes/src/funciones_especiales_5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/funciones_especiales_5.jpg -------------------------------------------------------------------------------- /Notes/src/funciones_especiales_6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/funciones_especiales_6.jpg -------------------------------------------------------------------------------- /Notes/src/funciones_especiales_7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/funciones_especiales_7.jpg -------------------------------------------------------------------------------- /Notes/src/funciones_especiales_8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/funciones_especiales_8.jpg -------------------------------------------------------------------------------- /Notes/src/funciones_especiales_9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/funciones_especiales_9.jpg -------------------------------------------------------------------------------- /Notes/src/insersion_masiva_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/insersion_masiva_1.jpg -------------------------------------------------------------------------------- /Notes/src/insersion_masiva_10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/insersion_masiva_10.jpg -------------------------------------------------------------------------------- /Notes/src/insersion_masiva_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/insersion_masiva_2.jpg -------------------------------------------------------------------------------- /Notes/src/insersion_masiva_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/insersion_masiva_3.jpg -------------------------------------------------------------------------------- /Notes/src/insersion_masiva_4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/insersion_masiva_4.jpg -------------------------------------------------------------------------------- /Notes/src/insersion_masiva_5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/insersion_masiva_5.jpg -------------------------------------------------------------------------------- /Notes/src/insersion_masiva_6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/insersion_masiva_6.jpg -------------------------------------------------------------------------------- /Notes/src/insersion_masiva_7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/insersion_masiva_7.jpg -------------------------------------------------------------------------------- /Notes/src/insersion_masiva_8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/insersion_masiva_8.jpg -------------------------------------------------------------------------------- /Notes/src/insersion_masiva_9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/insersion_masiva_9.jpg -------------------------------------------------------------------------------- /Notes/src/insert_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/insert_1.jpg -------------------------------------------------------------------------------- /Notes/src/insert_10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/insert_10.jpg -------------------------------------------------------------------------------- /Notes/src/insert_11.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/insert_11.jpg -------------------------------------------------------------------------------- /Notes/src/insert_12.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/insert_12.jpg -------------------------------------------------------------------------------- /Notes/src/insert_13.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/insert_13.jpg -------------------------------------------------------------------------------- /Notes/src/insert_14.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/insert_14.jpg -------------------------------------------------------------------------------- /Notes/src/insert_15.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/insert_15.jpg -------------------------------------------------------------------------------- /Notes/src/insert_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/insert_2.jpg -------------------------------------------------------------------------------- /Notes/src/insert_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/insert_3.jpg -------------------------------------------------------------------------------- /Notes/src/insert_4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/insert_4.jpg -------------------------------------------------------------------------------- /Notes/src/insert_5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/insert_5.jpg -------------------------------------------------------------------------------- /Notes/src/insert_6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/insert_6.jpg -------------------------------------------------------------------------------- /Notes/src/insert_7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/insert_7.jpg -------------------------------------------------------------------------------- /Notes/src/insert_8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/insert_8.jpg -------------------------------------------------------------------------------- /Notes/src/insert_9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/insert_9.jpg -------------------------------------------------------------------------------- /Notes/src/join_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/join_1.jpg -------------------------------------------------------------------------------- /Notes/src/maintenance_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/maintenance_1.jpg -------------------------------------------------------------------------------- /Notes/src/particiones_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/particiones_1.jpg -------------------------------------------------------------------------------- /Notes/src/particiones_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/particiones_2.jpg -------------------------------------------------------------------------------- /Notes/src/particiones_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/particiones_3.jpg -------------------------------------------------------------------------------- /Notes/src/particiones_4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/particiones_4.jpg -------------------------------------------------------------------------------- /Notes/src/particiones_5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/particiones_5.jpg -------------------------------------------------------------------------------- /Notes/src/particiones_6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/particiones_6.jpg -------------------------------------------------------------------------------- /Notes/src/particiones_7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/particiones_7.jpg -------------------------------------------------------------------------------- /Notes/src/particiones_8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/particiones_8.jpg -------------------------------------------------------------------------------- /Notes/src/pgadmin_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/pgadmin_1.jpg -------------------------------------------------------------------------------- /Notes/src/pgadmin_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/pgadmin_2.jpg -------------------------------------------------------------------------------- /Notes/src/pgadmin_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/pgadmin_3.jpg -------------------------------------------------------------------------------- /Notes/src/pgadmin_4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/pgadmin_4.jpg -------------------------------------------------------------------------------- /Notes/src/pgadmin_5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/pgadmin_5.jpg -------------------------------------------------------------------------------- /Notes/src/pgadmin_6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/pgadmin_6.jpg -------------------------------------------------------------------------------- /Notes/src/pl_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/pl_1.jpg -------------------------------------------------------------------------------- /Notes/src/pl_10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/pl_10.jpg -------------------------------------------------------------------------------- /Notes/src/pl_11.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/pl_11.jpg -------------------------------------------------------------------------------- /Notes/src/pl_12.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/pl_12.jpg -------------------------------------------------------------------------------- /Notes/src/pl_13.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/pl_13.jpg -------------------------------------------------------------------------------- /Notes/src/pl_14.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/pl_14.jpg -------------------------------------------------------------------------------- /Notes/src/pl_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/pl_2.jpg -------------------------------------------------------------------------------- /Notes/src/pl_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/pl_3.jpg -------------------------------------------------------------------------------- /Notes/src/pl_4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/pl_4.jpg -------------------------------------------------------------------------------- /Notes/src/pl_5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/pl_5.jpg -------------------------------------------------------------------------------- /Notes/src/pl_6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/pl_6.jpg -------------------------------------------------------------------------------- /Notes/src/pl_7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/pl_7.jpg -------------------------------------------------------------------------------- /Notes/src/pl_8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/pl_8.jpg -------------------------------------------------------------------------------- /Notes/src/pl_9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/pl_9.jpg -------------------------------------------------------------------------------- /Notes/src/postgre_instal_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/postgre_instal_1.jpg -------------------------------------------------------------------------------- /Notes/src/postgre_instal_10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/postgre_instal_10.jpg -------------------------------------------------------------------------------- /Notes/src/postgre_instal_11.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/postgre_instal_11.jpg -------------------------------------------------------------------------------- /Notes/src/postgre_instal_12.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/postgre_instal_12.jpg -------------------------------------------------------------------------------- /Notes/src/postgre_instal_13.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/postgre_instal_13.jpg -------------------------------------------------------------------------------- /Notes/src/postgre_instal_14.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/postgre_instal_14.jpg -------------------------------------------------------------------------------- /Notes/src/postgre_instal_15.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/postgre_instal_15.jpg -------------------------------------------------------------------------------- /Notes/src/postgre_instal_16.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/postgre_instal_16.jpg -------------------------------------------------------------------------------- /Notes/src/postgre_instal_17.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/postgre_instal_17.jpg -------------------------------------------------------------------------------- /Notes/src/postgre_instal_18.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/postgre_instal_18.jpg -------------------------------------------------------------------------------- /Notes/src/postgre_instal_19.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/postgre_instal_19.jpg -------------------------------------------------------------------------------- /Notes/src/postgre_instal_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/postgre_instal_2.jpg -------------------------------------------------------------------------------- /Notes/src/postgre_instal_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/postgre_instal_3.jpg -------------------------------------------------------------------------------- /Notes/src/postgre_instal_4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/postgre_instal_4.jpg -------------------------------------------------------------------------------- /Notes/src/postgre_instal_5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/postgre_instal_5.jpg -------------------------------------------------------------------------------- /Notes/src/postgre_instal_6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/postgre_instal_6.jpg -------------------------------------------------------------------------------- /Notes/src/postgre_instal_7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/postgre_instal_7.jpg -------------------------------------------------------------------------------- /Notes/src/postgre_instal_8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/postgre_instal_8.jpg -------------------------------------------------------------------------------- /Notes/src/postgre_instal_9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/postgre_instal_9.jpg -------------------------------------------------------------------------------- /Notes/src/replicas_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/replicas_1.jpg -------------------------------------------------------------------------------- /Notes/src/replicas_10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/replicas_10.jpg -------------------------------------------------------------------------------- /Notes/src/replicas_11.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/replicas_11.jpg -------------------------------------------------------------------------------- /Notes/src/replicas_12.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/replicas_12.jpg -------------------------------------------------------------------------------- /Notes/src/replicas_13.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/replicas_13.jpg -------------------------------------------------------------------------------- /Notes/src/replicas_14.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/replicas_14.jpg -------------------------------------------------------------------------------- /Notes/src/replicas_15.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/replicas_15.jpg -------------------------------------------------------------------------------- /Notes/src/replicas_16.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/replicas_16.jpg -------------------------------------------------------------------------------- /Notes/src/replicas_17.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/replicas_17.jpg -------------------------------------------------------------------------------- /Notes/src/replicas_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/replicas_2.jpg -------------------------------------------------------------------------------- /Notes/src/replicas_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/replicas_3.jpg -------------------------------------------------------------------------------- /Notes/src/replicas_4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/replicas_4.jpg -------------------------------------------------------------------------------- /Notes/src/replicas_5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/replicas_5.jpg -------------------------------------------------------------------------------- /Notes/src/replicas_6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/replicas_6.jpg -------------------------------------------------------------------------------- /Notes/src/replicas_7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/replicas_7.jpg -------------------------------------------------------------------------------- /Notes/src/replicas_8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/replicas_8.jpg -------------------------------------------------------------------------------- /Notes/src/replicas_9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/replicas_9.jpg -------------------------------------------------------------------------------- /Notes/src/tipos_join.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/tipos_join.jpg -------------------------------------------------------------------------------- /Notes/src/transacciones_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/transacciones_1.jpg -------------------------------------------------------------------------------- /Notes/src/transacciones_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/transacciones_2.jpg -------------------------------------------------------------------------------- /Notes/src/transacciones_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/transacciones_3.jpg -------------------------------------------------------------------------------- /Notes/src/transacciones_4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/transacciones_4.jpg -------------------------------------------------------------------------------- /Notes/src/transacciones_5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/transacciones_5.jpg -------------------------------------------------------------------------------- /Notes/src/transacciones_6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/transacciones_6.jpg -------------------------------------------------------------------------------- /Notes/src/trigger_1.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/trigger_1.jpeg -------------------------------------------------------------------------------- /Notes/src/trigger_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/trigger_1.jpg -------------------------------------------------------------------------------- /Notes/src/trigger_10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/trigger_10.jpg -------------------------------------------------------------------------------- /Notes/src/trigger_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/trigger_2.jpg -------------------------------------------------------------------------------- /Notes/src/trigger_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/trigger_3.jpg -------------------------------------------------------------------------------- /Notes/src/trigger_4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/trigger_4.jpg -------------------------------------------------------------------------------- /Notes/src/trigger_5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/trigger_5.jpg -------------------------------------------------------------------------------- /Notes/src/trigger_6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/trigger_6.jpg -------------------------------------------------------------------------------- /Notes/src/trigger_7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/trigger_7.jpg -------------------------------------------------------------------------------- /Notes/src/trigger_8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/trigger_8.jpg -------------------------------------------------------------------------------- /Notes/src/trigger_9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/trigger_9.jpg -------------------------------------------------------------------------------- /Notes/src/views_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/views_1.jpg -------------------------------------------------------------------------------- /Notes/src/views_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/views_2.jpg -------------------------------------------------------------------------------- /Notes/src/views_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/views_3.jpg -------------------------------------------------------------------------------- /Notes/src/views_4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/views_4.jpg -------------------------------------------------------------------------------- /Notes/src/views_5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/views_5.jpg -------------------------------------------------------------------------------- /Notes/src/views_6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rb-one/Curso_PostgreSQL/295fea5faf6df5fbb0e1845be4eb83214ae8e3bb/Notes/src/views_6.jpg --------------------------------------------------------------------------------