Olá, estou tentando encontrar uma maneira de garantir que os prazos inseridos sejam posteriores à hora e data atuais. Atualmente estou tentando isso com uma regra.
CREATE OR REPLACE RULE "DeadlineInput" AS
ON INSERT TO "ComLog"
WHERE new."Deadline" < now() DO INSTEAD SELECT "ThrowError"('New deadline must be after current time'::bpchar) AS "ThrowError";
COMMENT ON RULE "DeadlineInput" ON "ComLog" IS 'Ensures deadline input is after the current time.';
Estou usando uma função separada para tentar lançar um erro, pois quando tentei fazer isso dentro da Regra, falhou porque o idioma estava errado. O seguinte é a minha função.
-- Function: "ThrowError"(character)
-- DROP FUNCTION "ThrowError"(character);
CREATE OR REPLACE FUNCTION "ThrowError"("ErrorString" text)
RETURNS void AS
$BODY$
BEGIN
RAISE EXCEPTION '%', "ErrorString";
END;
$BODY$
LANGUAGE plpgsql IMMUTABLE
COST 100;
ALTER FUNCTION "ThrowError"(character)
OWNER TO reuben;
Isso sempre produz a mensagem de erro, independentemente da data e não sei por quê. Como uma questão secundária, existe uma maneira de fazer com que a string passada para minha função contenha a hora atual. Algo como"ThrowError"('New deadline must be after current time %' now())
Obrigado
Aqui está o que o manual atual diz em Rules Versus Triggers :
Considere implementar a verificação em um gatilho, não em uma regra. O gatilho é a ferramenta perfeita para o trabalho no seu caso. Por outro lado, é um fato conhecido que as regras são delicadas e muito mais difíceis de dominar.