Какие объекты в реляционных базах данных содержат сохраненный исполняемый SQL-код?

Ответ

В SQL-базах данных (PostgreSQL, MySQL, MS SQL) есть несколько типов объектов, хранящих предопределенный код:

1. Хранимые процедуры (Stored Procedures)

  • Наиболее распространенный объект. Содержит последовательность SQL-операторов.
  • Может принимать входные параметры, выполнять сложную бизнес-логику на стороне БД.
  • Не обязана возвращать значение (может модифицировать данные).
  • Пример (PostgreSQL):

    CREATE OR REPLACE PROCEDURE archive_old_orders(cutoff_date DATE)
    LANGUAGE plpgsql
    AS $$
    BEGIN
        INSERT INTO orders_archive
        SELECT * FROM orders WHERE order_date < cutoff_date;
    
        DELETE FROM orders WHERE order_date < cutoff_date;
        COMMIT;
    END;
    $$;
    -- Вызов
    CALL archive_old_orders('2023-01-01');

2. Пользовательские функции (User-Defined Functions)

  • Обязаны возвращать значение (скалярное или табличное).
  • Могут использоваться внутри SQL-запросов как часть выражений.
  • Пример скалярной функции:

    CREATE FUNCTION get_total_sales(employee_id INT) 
    RETURNS DECIMAL AS $$
    BEGIN
        RETURN (SELECT SUM(amount) FROM sales WHERE emp_id = employee_id);
    END;
    $$ LANGUAGE plpgsql;
    
    -- Использование в запросе
    SELECT name, get_total_sales(id) FROM employees;

3. Триггеры (Triggers)

  • Специальный вид хранимой процедуры, которая автоматически выполняется при наступлении определенного события (INSERT, UPDATE, DELETE) с таблицей.
  • Часто используются для аудита, поддержания целостности данных.

4. Представления (Views) и Материализованные представления (Materialized Views)

  • View: Виртуальная таблица, определяемая SQL-запросом. Код запроса хранится в БД.
  • Materialized View: Физически сохраняет результат запроса, который можно обновлять. Содержит и код запроса, и данные.

Ответ 18+ 🔞

Да ты посмотри, какие штуки в базах данных припрятаны, а? Это ж целый арсенал, чтобы данные не просто лежали, а прямо плясали под твою дудку. Сейчас разберём, что к чему, без этой академической сухости, на пальцах.

1. Хранимые процедуры (Stored Procedures) Ну, это как главный заводила в этой каморке. Ты ему задание даёшь — он его выполняет от и до. Можешь сунуть в него кучу параметров, а он там внутри накрутит такую логику, что мама не горюй. Возвращать что-то — не его дело, его дело делать. Архив там создать, записи перетереть — он за всё берётся.

CREATE OR REPLACE PROCEDURE archive_old_orders(cutoff_date DATE)
LANGUAGE plpgsql
AS $$
BEGIN
    INSERT INTO orders_archive
    SELECT * FROM orders WHERE order_date < cutoff_date;

    DELETE FROM orders WHERE order_date < cutoff_date;
    COMMIT;
END;
$$;
-- А запускается просто, как старый добрый движок:
CALL archive_old_orders('2023-01-01');

2. Пользовательские функции (User-Defined Functions) А вот это уже не работяга, а больше такой... интеллигент. Он обязан тебе что-то вернуть. Скаляр, таблицу — но вернуть. Его можно прямо в запрос встроить, как винтик, и он там тихо своё дело сделает. Удобно, чёрт возьми.

CREATE FUNCTION get_total_sales(employee_id INT) 
RETURNS DECIMAL AS $$
BEGIN
    RETURN (SELECT SUM(amount) FROM sales WHERE emp_id = employee_id);
END;
$$ LANGUAGE plpgsql;

-- И пошла плясать логика прямо в селекте:
SELECT name, get_total_sales(id) FROM employees;

3. Триггеры (Triggers) О, это моя любимая тема, ёпта! Это как скрытый снайпер на чердаке. Сидит себе, молчит. Но стоит только в таблице что-то произойти — бац INSERT, бац UPDATE — он тут как тут, отрабатывает свою программу. Идеально для аудита, чтобы знать, какая сволочь и когда последний раз меняла цены. Автоматизация, блядь, в чистом виде.

4. Представления (Views) и Материализованные представления С View всё просто — это такой хитрый фокус. Таблицы как бы нет, а запрос есть. Запросил — он на лету всё посчитал и отдал. Красиво, но если запрос тяжёлый, то каждый раз будет ебать тебе мозг производительностью.

А вот Materialized View — это уже серьёзный парень. Он не просто запрос хранит, он результат этого запроса материализует, в рот меня чих-пых! То есть данные физически лежат. Быстро? Овердохуища быстро! Но чтобы они свежими были, их надо периодически REFRESH-ить, обновлять, то есть. Зато скорость выборки — просто песня.

Вот и весь базовый набор, чтобы не просто данные хранить, а чтобы они работали, сука, как швейцарские часы. Выбирай инструмент по задаче и вперёд.