Estimados todos:

Como son ya varias las ocasiones en las cuales he sufrido sudores fríos al borrar/actualizar registros que no deberían serlo, me he decidido a incorporar un trigger en las tablas a proteger. He visto un módulo llamado tuplock que lo viene resolviendo, pero al no ser un módulo digamos estándar, no me interesa incrporarlo. Mi pregunta es en el sentido siguiente:¿El trigger que os presento a continuación (en el fondo muy parecido a tuplock) sería suficiente o es necesario otro tipo de aproximación para resolver el problema? Téngase en cuenta que soy usuario de postgresql con requerimientos sencillos (no bases de datos emprsariales, etc)

Muchas gracias, un saludo

Jorge Tornero

(Se cuenta con que la tabla a proteger (en el ejemplo, prueba) cuenta con un campo /protected/ booleano)

CREATE OR REPLACE FUNCTION check_row_protection() RETURNS TRIGGER AS
$check_row_protection$
    DECLARE
    BEGIN
        IF TG_OP='UPDATE' THEN
IF (OLD.protected=False) or (NEW.protected=False and OLD.protected=True) then
                RETURN NEW;
            ELSE
RAISE EXCEPTION 'NO SE PUEDE HACER UPDATE: LA CONSULTA AFECTA A REGISTROS PROTEGIDOS';
                RETURN NULL;
            END IF;
        ELSIF TG_OP='DELETE' THEN
            IF OLD.protected=False THEN
                RETURN OLD;
            ELSE
RAISE EXCEPTION 'NO SE PUEDE HACER DELETE: LA CONSULTA AFECTA A REGISTROS PROTEGIDOS';
                RETURN NULL;
            END IF;
        END IF;

    END;
$check_row_protection$ LANGUAGE plpgsql;

DROP TRIGGER IF EXISTS protect_prueba ON prueba;
CREATE TRIGGER protect_prueba
BEFORE DELETE OR UPDATE ON prueba
    FOR EACH ROW EXECUTE PROCEDURE check_row_protection();


Responder a