No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

Adquiere por un a帽o todos los cursos, escuelas y certificados por un precio especial.

Antes: $249

Currency
$219/a帽o

Paga en 4 cuotas sin intereses

Paga en 4 cuotas sin intereses
Comprar ahora

Termina en:

2D
11H
51M
21S

Actualizando precios

28/34
Recursos

Aportes 34

Preguntas 7

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

o inicia sesi贸n.

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?

Totalmente perdido en esta clase 馃槙

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();

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() ;

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

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

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.

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).

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

鈥擟reating 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

鈥擟reating 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'; 

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();

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