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

«Какие объекты в реляционных базах данных содержат сохраненный исполняемый SQL-код?» — вопрос из категории Базы данных и SQL, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В 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: Физически сохраняет результат запроса, который можно обновлять. Содержит и код запроса, и данные.