как создать функцию триггеров перед вставкой показать тестовое сообщение - PullRequest
0 голосов
/ 03 января 2019

у меня есть стол

CREATE TABLE test.emp (
  empname text,
  salary integer,
  last_date timestamp,
  last_user text
);

и функция

CREATE FUNCTION test.emp_stamp() RETURNS trigger AS $emp_stamp$
BEGIN
    -- Check that empname and salary are given
    IF NEW.empname IS NULL THEN
        RAISE EXCEPTION 'empname cannot be null';
    END IF;
    IF NEW.salary IS NULL THEN
        RAISE EXCEPTION '% cannot have null salary', NEW.empname;
    END IF;

    -- Who works for us when she must pay for it?
    IF NEW.salary < 0 THEN
        RAISE EXCEPTION '% cannot have a negative salary', NEW.empname;
    END IF;

    -- Remember who changed the payroll when
    NEW.last_date := current_timestamp;
    NEW.last_user := current_user;
    RETURN NEW;
END;
$emp_stamp$ LANGUAGE plpgsql;

как показать сообщение, нет необходимости обновлять значения, как я могу изменить свою функцию

триггер

CREATE TRIGGER emp_stamp BEFORE INSERT OR UPDATE ON test.emp
   FOR EACH ROW EXECUTE PROCEDURE test.emp_stamp();

1 Ответ

0 голосов
/ 03 января 2019

Я думаю, все, что вам нужно сделать, это 1) убедиться, что это обновление, а не вставка (в противном случае ссылка на old не имеет никакого смысла, и 2) сравнить с существующей записью. Поскольку имя сотрудника похоже на PK, а последние два поля предназначены только для регистрации изменений, я предполагаю, что вы хотите проверить только зарплату:

-- Who works for us when she must pay for it?
IF NEW.salary < 0 THEN
    RAISE EXCEPTION '% cannot have a negative salary', NEW.empname;
elsif TG_OP = 'UPDATE' and new.salary = old.salary then
    RAISE EXCEPTION 'salary is already %', NEW.salary;
END IF;

Но, конечно, вы также можете использовать это для любой области. Если вы хотите убедиться, что хотя бы одно изменение изменилось, это было бы примерно так:

elsif TG_OP = 'UPDATE' and
   new.salary = old.salary and
   new.last_date = old.last_date and 
   new.last_user = old.last_user then
    RAISE EXCEPTION 'Update does not alter any data';
END IF;
...