- •Работа с субд PostgreSql
- •Работа с субд PostgreSql
- •Введение
- •1Установка PostgreSql
- •2Создание новой бд
- •2.1Создание новой бд
- •2.2Создание новой таблицы
- •2.3Создание связей между таблицами
- •3Создание индексов
- •4Доступ к PostgreSql из Java
- •4.1Соединение с PostgreSql
- •4.2Взаимодействие с бд
- •5Создание представлений
- •6Хранимые процедуры и Триггеры
- •6.1Хранимые процедуры
- •6.1.1Оператор Create Function языка pl/pgSql
- •6.1.2Создание хранимых процедур в pgAdmin III
- •6.1.3Вызов хранимых процедур в Java
- •6.2Триггеры бд
- •6.2.1Синтаксис определения триггера в PostgreSql
- •6.2.2Создание триггера в PgAdmin III
- •7Права доступа
- •Создание ролей;
- •7.1Создание ролей
- •7.2Назначение прав доступа
- •7.3Отмена прав доступа
- •7.4Проверка прав доступа
- •8Резервное копирование и восстановление бд
- •8.1Резервное копирование (BackUp) бд
- •8.2Восстановление (Restore) бд
- •8.3Создание sql-дампа бд
- •8.4Восстановление sql-дампа бд
- •8.5Восстановление sql-дампа средствами pgAdmin III
- •9Особенности взаимодействия субд access и PostgreSql
- •9.1Подготовка соединения PostgreSql с бд в Access
- •9.2Копирование таблиц Access в таблицы PostgreSql
- •9.3Подключение таблиц PostgreSql к бд в Access
- •10Администрирование PostgreSql
- •Литература
6Хранимые процедуры и Триггеры
6.1Хранимые процедуры
В серверах БД возможно создание процедур, использующих язык SQL и дополнительные операторы структурного программирования, принадлежащие языку создания хранимых процедур. В СУБД PostrgeSQL одним из таких языков является PL/pgSQL [8].
Хранимая процедура хранится вместе с описанием БД и может быть выполнена любым пользователем, который имеет разрешение и права на ее исполнение. Она может запускаться вызывающим ее приложением, правилами проверки целостности данных либо триггерами.
Преимущество хранимых процедур состоит в том, что они выполняются в среде сервера БД.
Хранимые процедуры могут возвращать некоторую величину или набор величин, а так же модифицировать и проверять введенные пользователем значения на соответствие предварительно заданным условиям.
В хранимую процедуру можно передавать значения – аргументы или входные параметры. В то же время она может возвращать значения, которые берутся непосредственно из таблиц или вычисляются в ходе выполнения самой процедуры.
Замечание: Хранимая процедура в PostrgeSQL называется функцией.
6.1.1Оператор Create Function языка pl/pgSql
Программы PL/pgSQL состоят из блоков. Такой метод организации программного кода обычно называется блочной структурой. Программные блоки вводятся в командах SQL CREATE FUNCTION, которые используются для определения функций PL/pgSQL в базах данных PostgreSQL. Команда CREATE FUNCTION определяет имя функции, типы ее аргументов и возвращаемого значения.
Основной блок функции начинается с секции объявлений. Все переменные объявляются (а также могут инициализироваться значениями по умолчанию) в секции объявлений программного блока. В объявлении указывается имя и тип переменной. Секция объявлений обозначается ключевым словом DECLARE, а каждое объявление завершается символом точка с запятой ";".
После объявления переменных следует ключевое слово BEGIN, обозначающее начало основного программного блока. За ключевым словом BEGIN находятся операторы, входящие в блок. Конец программного блока обозначается ключевым словом END. Основной блок функции PL/pgSQL должен вернуть значение заданного типа, а все вложенные блоки (блоки, начинающиеся внутри других блоков) должны быть завершены до достижения ключевого слова END.
Синтаксис описания функции PL/pgSQL приведен ниже:
CREATE [OR REPLACE] FUNCTION <имя_функции> ([<параметры> <тип данных> , …])
RETURNS <тип_данных_результата> AS $$
[DECLARE объявление; ...]
BEGIN
<блок_операторов>; [...]
RETURN <имя_переменной>;
END;
$$
LANGUAGE 'plpgsql';
Пример 1. Добавить сведения о новом студенте. Эта функция c несколькими входными параметрами и не возвращает значений. Особенностью является то, что в качестве типа возвращаемого значения задается void.
CREATE OR REPLACE FUNCTION "insStudent"( st_no integer, st_name character varying, …)
--Определение типа результата функции
RETURNS void AS $$ // Указывается тип возвращаемого результата void
--Основной блок оператора Create Function
BEGIN
INSERT INTO Students(StNo, StName, …)
VALUES(st_no, st_name, …)
RETURN;
END; $$
LANGUAGE 'plpgsql';
Вызов этой функции в прикладной программе выглядит следующим образом:
SELECT * FROM public."setStudent"(958977, 'Иванов', …);
Далее средствами языка программирования следует подготовить входные параметры и отправить запрос на выполнение, ….
Пример 2. Функция без входных параметров и возвращает одно значение: Подсчитать сумму затрат на стипендию всех студентов.
CREATE OR REPLACE FUNCTION "getSumStipAll"()
--Определение типа результата функции
RETURNS real AS $$ // Указывается тип возвращаемого результата real
--Блок определения переменных
DECLARE summa real;
--Основной блок оператора Create Function
BEGIN
summa = ( SELECT sum ("StStipend") FROM public."Students" );
RETURN summa;
END; $$
LANGUAGE 'plpgsql';
Вызов этой функции в прикладной программе выглядит следующим образом:
SELECT * FROM public."getSumStipAll"();
Далее средствами конкретного языка программирования по работе с SQL‑запросами следует отправить запрос на выполнение, а затем выделить единственное поле оператора Select.
Пример 3. Функция с входным параметром и возвращает одно значение: Подсчитать сумму затрат на стипендию всех студентов группы Х, где Х – параметр, задающий название группы.
CREATE OR REPLACE FUNCTION "getStipGroup"(gr_name character varying)
RETURNS real AS
$$
DECLARE s real;
BEGIN
s = (SELECT SUM("Students"."StStipend")
FROM public."Students", public."Groups"
WHERE ("Students"."GrNo" = "Groups"."GrNo") AND
("Groups"."GrName" = gr_name));
RETURN s;
END;
$$
LANGUAGE 'plpgsql';
Вызов этой функции в прикладной программе выглядит следующим образом:
SELECT * FROM public."getStipGroup"('КС-071');
Далее средствами языка программирования следует подготовить 1-н входной параметр, отправить запрос на выполнение, а затем выделить возвращаемое поле оператора Select.
Пример 4. Функция с одним входным параметром и возвращает множество элементов (записей) таблицы. Вывести информацию о студентах группы Х, где Х – параметр, задающий название группы.
CREATE OR REPLACE FUNCTION "getStudGroup"(gr_name character varying)
--SETOF указывает на то, что возвращаемым результатом будет множество
--элементов (записей) таблицы "Students"
RETURNS SETOF "Students" AS
$$
BEGIN
--Чтобы вернуть множество записей необходимо после ключевого слова
-- return указать ключевое слово query, за которым следует текст запроса
RETURN QUERY SELECT "Students"."StNo", "Students"."GrNo", "Students"."StName",
"Students"."StCity", "Students"."StBrthDate","Students"."StSex",
"Students"."StStipend", "Students"."SrBall"
FROM public."Students", public."Groups"
WHERE (("Students"."GrNo" = "Groups"."GrNo") AND
("Groups"."GrName" = gr_name));
END;
$$
LANGUAGE 'plpgsql';
Вызов этой функции в прикладной программе выглядит следующим образом:
SELECT * FROM public."getStudGroup"('КС-071');
Далее средствами языка программирования следует подготовить 1-н входной параметр, отправить запрос на выполнение, а затем выделить возвращаемые поля оператора Select.
Пример 5. Функция с 2-мя входными параметрами и возвращает множество элементов (записей) таблицы: Добавить новую запись в таблицу Regions и вывести все записи из этой таблицы.
CREATE OR REPLACE FUNCTION "insRegion"(num_reg integer,
name_reg character varying)
RETURNS SETOF "Regions" AS
$$
BEGIN
INSERT INTO public."Regions" ("RgNo", "RgName")
VALUES (num_reg, name_reg);
RETURN QUERY SELECT "RgNo", "RgName" FROM public."Regions";
END;
$$
LANGUAGE 'plpgsql'
Как видно из примера 4, помимо оператора Select в основном блоке функции можно использовать и другие операторы языка SQL, а также операторы языка Pl/pgSQL.
Вызов этой функции в прикладной программе выглядит следующим образом:
SELECT * FROM public."insRegion"(4, 'Львовская');
Далее средствами конкретного языка программирования по работе с SQL‑запросами следует подготовить 2-ва входных параметра, а затем выделить поочередно возвращаемые значения полей оператора Select.
Следующий пример демонстрирует возможность функции возвращать несколько значений. В функцию передается три параметра: один входной (режим IN), и два выходных (режим OUT), через которые функция вернет результаты. Следует обратить внимание на то, что тип возвращаемого значения в этом случае – record.
Пример 6. Функция с одним входным и двумя выходными параметрами, через которые возвращается результат. Вывести количество студентов группы Х и средний балл по группе, Х – параметр, задающий название группы.
CREATE OR REPLACE FUNCTION "getCntAndSrBallGr" (IN "nameGr" character varying,
OUT "cntStud" integer, OUT "srBall" real)
RETURNS record AS
$$
begin
"cntStud" = (select count("Students"."StNo")
from public."Students", public."Groups"
where ("Students"."GrNo"="Groups"."GrNo") and
("Groups"."GrName"="nameGr"));
"srBall" = (select avg("Students"."SrBall")
from public."Students", public."Groups"
where ("Students"."GrNo"="Groups"."GrNo") and
("Groups"."GrName"="nameGr"));
end;
$$
LANGUAGE 'plpgsql'
Вызов этой функции в прикладной программе выглядит следующим образом:
SELECT * FROM public." getCntAndSrBallGr "('КС-071');
Далее средствами конкретного языка программирования по работе с SQL‑запросами следует подготовить входной параметр, а затем выделить поочередно возвращаемые значения полей оператора Select.