@givemoneybiatch
Немного веб, немного гейм

Как ограничить количество записей для пользователя в таблице PostgreSQL?

В таблице post нужно ограничить количество постов для пользователя, например до 3.
Например, используется NodeJS и pg-promise для запросов.
let db = require("./connection");
let post= function () {
    self = this;
    self.create = function (obj) {
        return db.query(`INSERT INTO public.post (user_id, title, message) VALUES ($(userId), $(title), $(message));`, obj);
    };
};
module.exports = post;

Можно перед каждым вызовом `post.create()` отправлять запрос в БД, получать количество постов и если оно меньше 3, то отправляем новый запрос и создаем пост, если же больше - отправляем ошибку на клиент.
Но мне кажется, что такие вещи, реализуются по-хорошему на уровне СУБД (или я ошибаюсь?)
Что-то типа такого, только не соображу как передать userId из роутинга NodeJS внутрь триггера?
CREATE OR REPLACE FUNCTION check_number_of_row_per_user()
RETURNS TRIGGER AS
$body$
BEGIN
   -- КАК ПЕРЕДАТЬ ПАРАМЕТР $(userId) ИЗ ЗАПРОСА?
    IF (SELECT count(*) FROM public.post WHERE user_id = $(userId)) > 2
    THEN 
        RAISE EXCEPTION 'INSERT statement exceeding maximum number of rows for table filter';
    END IF;
    RETURN NULL;
END;
$body$
LANGUAGE plpgsql;

CREATE TRIGGER tr_check_number_of_row_per_user 
BEFORE INSERT ON public.post
FOR EACH ROW EXECUTE PROCEDURE check_number_of_row_per_user();
  • Вопрос задан
  • 153 просмотра
Решения вопроса 1
@MadridianFox
Web-программист, многостаночник
Засовывать бизнес-логику в бд имеет смысл в двух случаях: 1 - для повышения быстродействия в очень критичных к этому местах, 2 - когда бд используется разными системами, для которых нельзя выделить общий код.

Ваш случай не такой, поэтому правильнее сделать проверку на JS.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы