audit_triggers.sql en SQL
Una auditoría de precios que la aplicación no puede olvidar: la escribe un trigger.
-- An audit trail: every price change recorded by a trigger, automatically.
CREATE TABLE price_audit (
id INTEGER PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
sku TEXT NOT NULL,
old_price NUMERIC(10, 2),
new_price NUMERIC(10, 2),
changed_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE FUNCTION log_price_change()
RETURNS trigger
LANGUAGE plpgsql
AS $$
BEGIN
IF NEW.price <> OLD.price THEN
INSERT INTO price_audit (sku, old_price, new_price)
VALUES (OLD.sku, OLD.price, NEW.price);
END IF;
RETURN NEW;
END;
$$;
CREATE TRIGGER price_history
AFTER UPDATE ON products
FOR EACH ROW
EXECUTE FUNCTION log_price_change();
-- Two real changes and one stock-only touch; only the changes land.
UPDATE products
SET price = 1999.00
WHERE sku = 'KAYAK-17';
UPDATE products
SET price = 279.00
WHERE sku = 'PADDLE-C';
UPDATE products
SET stock = stock + 5
WHERE sku = 'DRYBAG-20';
SELECT sku, old_price, new_price
FROM price_audit
ORDER BY id;
Cómo funciona
- La tabla
price_auditylog_price_change()capturan precio viejo y nuevo. - La guarda
IF NEW.price <> OLD.pricesalta las escrituras que tocan otras columnas. - Tres updates dejan dos filas de auditoría; la consulta final lee la historia.
Palabras clave y builtins usados aquí
AFTERASBEGINBYCREATEDEFAULTEACHENDEXECUTEFORFROMFUNCTIONGENERATEDIDENTITYIFINSERTINTEGERINTOKEYLANGUAGENEWNOTNULLNUMERICOLDONORDERPRIMARYRETURNRETURNSROWSELECTSETTABLETEXTTHENTRIGGERUPDATEVALUESWHEREtrigger
El intento, en números
- Líneas
- 43
- Caracteres a escribir
- 931
- Tokens
- 172
- Ritmo de tres estrellas
- 65 tpm
Al ritmo de tres estrellas de 65 tokens por minuto, este intento toma unos 159 segundos.
Ronda más rápida
- 🇺🇸 brendancol37 tpm
Paso 1 de 3 en Bis; paso 21 de 23 en Procedimientos almacenados de PostgreSQL.