No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Actualizando precios

28/34
Recursos

Aportes 37

Preguntas 8

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

No me quedo muy claro, como integro la tabla peliculas, con tipo_cambio, sin generar ningun join, como sabe que relacion tiene peliculas con tipo_cambio, seria 1 a muchos?

Pasos para hacer la trigger function

1️⃣ Parte 1: Crear el código del trigger

  1. Definir a donde iran los nuevos valores con INSERT_INTO().
  2. Seleccionar cuales valores se van a insertar.
  3. Devolver NEW en el trigger. Esto devuelve el registro.
-- *** PARTE 1 *** ---
-- Trigger functions > Create > Code
BEGIN
		-- Paso 1
    INSERT INTO precio_peliculas_tipo_cambio(
                pelicula_id,
                tipo_cambio_id,
                precio_tipo_cambio,
                ultima_actualizacion)
    -- Paso 2           
    SELECT      NEW.pelicula_id,
                tipos_cambio.tipo_cambio_id,
                tipos_cambio.cambio_usd * NEW.precio_renta AS precio_tipo_cambio,
                CURRENT_TIMESTAMP 
    FROM        tipos_cambio
    WHERE       tipos_cambio.codigo = 'MXN';
		-- Paso 3
    RETURN      NEW;
                     
END

2️⃣ Parte 2: Crear el trigger
Aquí hay que indicar:

  1. Nombre del trigger.
  2. Cuando se ejecuta (antes/despues)
  3. La tabla relacionada que servira como disparador.
  4. La ejecucion por cada registro.
  5. La funcion o sture procedure que ejecutara.
-- *** PARTE 2 *** --
-- (Opcional)
DROP TRIGGER IF EXISTS trigger_update_tipos_cambio
  ON public.peliculas;
-- Paso 1
CREATE TRIGGER trigger_update_tipos_cambio
-- Paso 2
    AFTER INSERT OR UPDATE 
-- Paso 3
    ON public.peliculas
-- Paso 4
    FOR EACH ROW 
-- Paso 5
    EXECUTE PROCEDURE public.precio_peliculas_tipo_cambio();

Totalmente perdido en esta clase 😕

La tuve que ver como 3 veces seguidas pero al final entendí

Código del trigger function

CREATE OR REPLACE FUNCTION public.precio_peliculas_tipo_cambio()
	returns trigger
	LANGUAGE plpgsql
AS $$
	BEGIN
INSERT INTO precio_peliculas_tipo_cambio(
pelicula_id,
tipo_cambio_id,
precio_tipo_cambio,
ultima_actualizacion
)
select  NEW.pelicula_id,
	    tipos_cambio.tipo_cambio_id,
		tipos_cambio.cambio_usd * NEW.precio_renta AS precio_tipo_cambio,
		CURRENT_TIMESTAMP
FROM tipos_cambio
WHERE tipos_cambio.codigo = 'MXN';
RETURN NEW;
	END
$$
;

Código del trigger en la tabla precio_peliculas_tipo_cambio

create trigger trigger_update_tipos_cambio after
insert
	or
update
	on
	public.peliculas for each row execute procedure public.precio_peliculas_tipo_cambio() ;

Pienso que esta parte de trigger debe haber un curso no tan extenso para diferentes casos hay muchos que se pierden me eh dado cuenta que dominar este superpoder no basta con pocos ejemplos.
Estaba un poco perdido en la parte de la función trigger ahora que eh revisado veo que primero va el insert y luego el select para considerar la conversión entonces lo que va ser el disparador es que cada vez que nosotros cambiemos un monto el disparado manda el update luego la función trigger se ejecuta y realiza la inserción con los campos de la nueva tabla que se realizo previamente luego el select funciona como values ya que recogera lo que se selecciona entonces insert into actualiza el dato.

Que beneficio tenemos con esto:

  • que cada vez que queramos actualizar un monto en cualquier precio solamente vas a la tabla cambias el precio.

Cual es el superpoder : El resto lo hará el disparador.

Me perdí en esta clase, entendí hasta antes de que empiece con los Triggers.

Esta parte me dejo muchas dudas, veo que se lanza sin mas a crear un tigger con la ayuda grafica del Pstgres. pero hay en esa nueva forma hay partes como la de public.??..hay como que se fue el curso.

Caso Práctico de Triggers

Yo pude seguir la clase pero lo que me paso es que muchas tablas estan actualizadas y por eso ya tenia llena la nueva tabla de actualizacion

no quedo muy claro

En que casos será mejor este tipo de acciones que se hacen con los triggers y no una acción dentro del código de una aplicación que use esta base de datos (ej. php, python).

28. Actualizando precios

SELECT peliculas.pelicula_id,
		tipos_cambio.tipo_cambio_id,
		tipos_cambio.cambio_usd * peliculas.precio_renta AS precio_MXN
FROM peliculas, tipos_cambio
WHERE tipos_cambio.codigo = 'MXN'

CREATE TRIGGER trigger_update_tipos_cambio
	AFTER INSERT OR UPDATE
	ON public.peliculas
	FOR EACH ROW
	EXECUTE PROCEDURE public.precio_peliculas_tipo_cambio();

para el de Colombia:

BEGIN
	INSERT INTO precio_peliculas_tipo_cambio(
	pelicula_id,
	tipo_cambio_id,
	precio_tipo_cambio,
	ultima_actualizacion
	)
	SELECT NEW.pelicula_id,
	t.tipo_cambio_id,
	t.cambio_usd * NEW.precio_renta AS precio_tipo_cambio,
	CURRENT_TIMESTAMP
	FROM tipos_cambio AS t
	WHERE t.codigo = 'COP';
END

Se me complican mucho los triggers 😦

Esta haciendo un trigger de in trigger XD

—Creating Trigger function instructions—
Creamos las intrucciones del Trigger, en este caso actualizar los precios de las películas en una nueva tabla (precio_peliculas_tipo_cambio) con sus respectivos precios convertidos de usd a mxn (tipos_cambio.cambio_usd * NEW.precio_renta):

BEGIN
    INSERT INTO precio_peliculas_tipo_cambio(
      pelicula_id,
      tipo_cambio_id,
      precio_tipo_cambio,
      ultima_actualizacion
      )
      SELECT NEW.pelicula_id,
        tipos_cambio.tipo_cambio_id,
        tipos_cambio.cambio_usd * NEW.precio_renta AS precio_tipo_cambio,
        CURRENT_TIMESTAMP
      FROM tipos_cambio
      WHERE tipos_cambio = 'MXN';
      RETURN NEW;
END

—Creating Trigger call execution (query)—
Creando ejecución del Trigger (mediante Query), tras la cual el Trigger queda en funcionamiento:

CREATE TRIGGER trigger_update_tipos_cambio
	AFTER INSERT OR UPDATE
	ON public.peliculas
	FOR EACH ROW
	EXECUTE PROCEDURE public.precio_peliculas_tipo_cambio();

El mismo se activará luego (AFTER) de que insertemos o actualicemos (INSERT OR UPDATE) nuestra tabla peliculas (public.peliculas), tras lo cual se añadirá/actualizará la conversión de tipo de cambio para cada pelicula hacia nuestra nueva tabla (precio_peliculas_tipo_cambio).

Entendiendo cada vez un poco mas SQL

SELECT peliculas.pelicula_id,
		peliculas.clasificacion,
		tipos_cambio.tipo_cambio_id,
		tipos_cambio.cambio_usd * peliculas.precio_renta AS precio_mxn
FROM peliculas,
	tipos_cambio
WHERE tipos_cambio.codigo = 'MXN' AND peliculas.clasificacion = 'R'; 
alguien sabe de donde sale el 5 de la primera columna?, estuve viendo el código SQL aparece esto pero sigo sin entender: precio\_pelicula\_tipo\_cambio bigint NOT NULL DEFAULT nextval('precio\_peliculas\_tipo\_cambio\_precio\_pelicula\_tipo\_cambio\_seq'::regclass), si alguien me puede explicar, no es de tipo serial.
1. **Sentencia SELECT**: * La primera parte de la consulta es una sentencia `SELECT`. Vamos a desglosarla: * `SELECT peliculas.pelicula_id, tipos_cambio.tipo_cambio_id, tipos_cambio.cambio_usd * peliculas.precio_renta AS precio_mxn` * Aquí estamos seleccionando tres columnas: * `peliculas.pelicula_id` * `tipos_cambio.tipo_cambio_id` * La expresión `tipos_cambio.cambio_usd * peliculas.precio_renta` se calcula y se le asigna un alias `precio_mxn`. * `FROM peliculas, tipos_cambio` * Estamos consultando datos de dos tablas: `peliculas` y `tipos_cambio`. * `WHERE tipos_cambio.codigo = 'MXN'` * Se aplica un filtro para seleccionar solo los registros donde el campo `codigo` en la tabla `tipos_cambio` sea igual a `'MXN'`. 2. **Procedimiento Almacenado**: * El bloque de código después de `-- update_precio_tipo_cambio` es un procedimiento almacenado. * Aquí está lo que hace: * Cuando se inserta o actualiza un registro en la tabla `peliculas`, se ejecuta este procedimiento. * Dentro del procedimiento: * Se inserta un nuevo registro en la tabla `precio_peliculas_tipo_cambio`. * Los valores se obtienen de la tabla `tipos_cambio` y se calcula el `precio_tipo_cambio` multiplicando `cambio_usd` por `precio_renta` (del nuevo registro en `peliculas`). * Se registra la fecha y hora actual en `ultima_actualizacion`. * Finalmente, se devuelve el nuevo registro. 3. **Trigger**: * Después del procedimiento almacenado, se crea un **trigger** llamado `trigger_update_tipos_cambio`. * Este trigger se ejecuta **después** de insertar o actualizar un registro en la tabla `peliculas`. * Cuando se activa, ejecuta el procedimiento almacenado `public.update_precio_tipo_cambio()`.
Según ChatGPT: En resumen, este conjunto de comandos en SQL establece un `TRIGGER` en la tabla `peliculas`, de modo que cada vez que se inserta o actualiza una fila en esa tabla, se ejecuta una función que realiza un cálculo y una inserción en otra tabla llamada `precio_peliculas_tipo_cambio`. Este cálculo parece estar relacionado con la conversión del precio de renta de las películas a una moneda específica, basada en un tipo de cambio definido en la tabla `tipos_cambio`.

Comparto mi código, que automatiza la inserción de precios para cada tipo de cambio que exista:

CREATE OR REPLACE FUNCTION price_movies_change_type()
RETURNS trigger
LANGUAGE plpgsql
AS
$$
BEGIN
WITH RECURSIVE recursive_tab (n) AS 
	(
	VALUES (1)
	UNION ALL
	SELECT n+1 FROM recursive_tab WHERE n < (SELECT MAX(tipos_cambio.tipo_cambio_id) FROM tipos_cambio)
	)
INSERT INTO precio_peliculas_tipo_cambio(
		pelicula_id,
		tipo_cambio_id,
		precio_tipo_cambio,
		ultima_actualizacion)
	SELECT
		NEW.pelicula_id,
		tipos_cambio.tipo_cambio_id,
		NEW.precio_renta * tipos_cambio.cambio_usd,
		CURRENT_TIMESTAMP
	FROM
	recursive_tab,
	tipos_cambio
	WHERE tipos_cambio.tipo_cambio_id = n;
	RETURN NEW;
END
$$

CREATE TRIGGER trigger_update_change_type
	AFTER INSERT OR UPDATE
	ON public.peliculas
	FOR EACH ROW
	EXECUTE PROCEDURE public.price_movies_change_type();

Me parece que falto profundizar en la parte de la creación del trigger, ya que el ejemplo es muy complejo para mi de entender.

creo que la mayoria no vio previamente el curos de PostgreSQL, por eso estan perdidos, ahi explican mas a fondo lo de los triiggers

Los cursos de Israel son bastante buenos, pero lo que he podido evidenciar a lo largo de la ruta de aprendizaje es que es una metodología orientada a la auditoria de BD, es decir hacia convertirte en un DBA, sin embargo es muy bueno lo que acá se muestra y es conocer la estructura de las consultas.

CONSULTA ME DICE EN EL MIN 11:10 : ERROR: no existe la función public.update_precio_peliculas_tipo_cambio()
SQL state: 42883

Edgar, respecto a su inquietud, no se join entre las 2 tablas porque solo hay un tipo de moneda, y en ese sentido como filtra por pesos mexicanos solo va a ver un solo registro de salida en el tipo de cambio.

Es interesante el desarrollo de este tipo de proyectos, pero desde lo que conozco y la teoría de normalización de las bases de datos los datos deben ser únicos y no deberíamos tener datos que puedan ser calculados, para evitar la redundancia, de igual forma existen las vistas y podríamos generar una vista que nos permita tener los datos de las monedas

-- DROP VIEW public."V_Precios_Monedas";

CREATE OR REPLACE VIEW public."V_Precios_Monedas" AS
 SELECT P.pelicula_id,
    TC.codigo,
    TC.cambio_usd * P.precio_renta AS precio_cambio
   FROM peliculas as P,
    tipos_cambio as TC;

Buen ejercicio, claro, se debería colocar una opción que este tipo de cursos no se habiliten si no ven el básico, de este por ejemplo el curso de PostgreSQL, dado que en este se explica esto que hace Israel

Para la primera parte al tratar de hacerlo por mi mismo encontré este otro query

SELECT	peliculas.pelicula_id,
		tipos_cambio.tipo_cambio_id,
		tipos_cambio.cambio_usd * peliculas.precio_renta AS precio_mxn
FROM	precio_peliculas_tipo_cambio
	INNER JOIN peliculas ON peliculas.pelicula_id = precio_peliculas_tipo_cambio.pelicula_id
	INNER JOIN tipos_cambio ON precio_peliculas_tipo_cambio.tipo_cambio_id = tipos_cambio.tipo_cambio_id
GROUP BY peliculas.pelicula_id, tipos_cambio.tipo_cambio_id
ORDER BY peliculas.pelicula_id

Entendido

como puedo llenar campos vacios en postgre?

Pense que habia un error en esta consulta, ya que no existe la realación peliculas y tipo de cambio en el where. Pero entendí que el precio de renta esta dado en USD, por lo que todos los registros de la tabla peliculas se multiplican con el el mismo valor (tipo_cambio.cambio_usd)

De donde saca el tipo de cambio? es en tiempo real ?

Excelente clase, creo que no era necesario utilizar el lenguage plpgsql, con el lenguage SQL era suficiente, pero como practica esta clase me parece genial. Gracias.

interesante

buen ejercicio