- •Список экзаменационных вопросов по дисциплине “Базы данных, знаний и экспертные системы”.
- •Трехуровневая архитектура
- •Основные утилиты
- •Анализатор запросов Query Analyzer
- •Именование объектов при работе с субд, поддерживающими распределенную обработку данных. Создание и изменение таблиц.
- •Типы ограничений
- •Ограничения ключей
- •Ограничения первого ключа
- •Ограничения внешнего ключа
- •Добавление внешнего ключа в существующую таблицу:
- •Ограничение уникальности
- •Ограничение проверки
- •Ограничения стандартных значений
- •Объекты sql Server – правила и стандартные значения
- •Сравнение средств поддержки целостности данных
- •Системы безопасности субд sql Server
- •Компоненты структуры безопастности
- •Серверные роли и роли бд, определяемые пользователем роли
- •Фиксированные роли сервера
- •Фиксированные роли бд
- •Индексация в субд
- •Представления
- •Хранимые процедуры
- •Синтаксис оператора создания хранимой процедуры
- •Ситуация когда происходит автоматическая перкомпиляция процедуры:
- •Объявление параметров хранимых процедур
- •Триггеры. Создание и виды триггеров
- •1.1 Типы функций
- •1.2 Достоинства использования
- •2.4 Представление знаний с использованием фреймов
- •2.5 Представление знаний с использованием семантических сетей
- •2.6 Представление знаний в виде нечетких высказываний
- •Пример : фреймовая модель системы лексических значений.
- •Выводы.
- •Режимы функционирования Экспертных систем
- •Классификация Экспертных систем по решаемой задаче
- •Классификация Экспертных систем по связи с реальным временем
- •Понятие метаданные
- •Интеграция с инфраструктурой хранилищ данных
Хранимые процедуры
НЕДОСТАТКИ:
Отсутствие переносимости между платформами
Опасность фиксации неверного плана выполнения (смотри опцию WITH RECOMPLITE)
Синтаксис оператора создания хранимой процедуры
CREATE PROC[EDURE]<имя_процедуры>
[<имя_параметра><тип_данных>
[=<значение_по_умолчанию>][OUTPUT]
[,…]]
[WITH RECOMPLINE|ENCRYPTION|RECOMPLINE, ENCRYPTION]
[FOR REPLICATION]
AS <код>
Например
CREATE PROC spShippers
AS SELECT*FROM Shippers
GO
EXEC spShippers
Изменение хранимых процедур выполняется команда ALTER PROC, которая применяется для уже существующего объекта и оставляет неизменными все установленные для хранимых процедур права доступа.
Если применяется оператор DROP, а затем CREATE, то права доступа необходимо переустановить.
Удаление хранимых процедур == DROP PROC <имя_процедуры>
При выполнении директивы CREATE PROC осуществляет синтаксический анализ запросов.
После создания, процедура в результате первого вызова будет оптимизирована, скомпилирована и закэширована(помещена в кэш память) в системе.
При последующих запусках хранимых процедур на выполнение будет использоваться закэшированная версия (кроме случая, если используем опцию WITH RECOMPLITE). Это значит, что использование хранимых процедур не требует при выполнении времени на оптимизацию и компиляцию.
Ситуация когда происходит автоматическая перкомпиляция процедуры:
Процедуры всегда перекомпилируются при первом запуске, произошедшем с момента очередного запуска SQL.
План вполнения процедуры также автоматически перекомпилируется в случае удаления индекса таблицы, на которую есть ссылки в процедуре.
Перекомпиляция плана происходит в случае, если в данный момент его использует другой пользователь. Тогда для второго пользователя создается второй экземпляр плана выполнения процедуры.
Автоматическая перекомпиляция в случае удаления и повторного создания хранимой процедуры.
Использование опции WITH RECOMPLITE.
Нельзя использовать опцию WITH RECOMPLITE в операторе FOR REPLICATION (опция используется для создания процедуры, которая выполняется во время репликации)
Чтобы зашифровать определение хранимых процедур, которые вносятся в системную таблицу syscomments, используют опцию ENCRIPTION с помощью запуска sp_helptext <имя_процедуры> или с помощью запроса:
Select c.id, c.text
FROM syscomments c INNER JOIN sysobjects o
ON c.id = o.id
WHERE o.name =’<имя_хранимой_процедуры>’
Объявление параметров хранимых процедур
Необходимо указать следующую информацию:
Имя
Тип данных
Значение по умолчанию
Направление (входной или выходной)
Синтаксис:
<имя_параметра> [AS]
<тип_данных>[=<умолчание>][OUTPUT]
Имя параметра должно начинаться с символа @, использование пробелов недопустимо
Оператор RETURN выполняет выход из процедуры:
RETURN [<целое_возвращаемое_значение>]
Для получения возвращаемого RETURN значения нужно определить некоторую переменную в операторе EXEC.
DECLARE @ReturnVal int
EXEC @ReturnVal=proc2
SELECT @ReturnVal
РЕКУРСИЯ
В программировании рекурсия — вызов функции (процедуры) из неё же самой, непосредственно (простая рекурсия) или через другие функции (сложная или косвенная рекурсия), например, функция A вызывает функцию B, а функция B — функцию A. Количество вложенных вызовов функции или процедуры называется глубиной рекурсии.
Преимущество рекурсивного определения объекта заключается в том, что такое конечное определение теоретически способно описывать бесконечно большое число объектов. С помощью рекурсивной программы же возможно описать бесконечное вычисление, причём без явных повторений частей программы.
Рекурсивны SQL запросы являются одним из способов решения проблемы дерева и других проблем, требующих рекурсивную обработку. Они были добавлены в стандарт SQL 99. До этого они уже существовали в Oracle. Несмотря на то, что стандарт вышел так давно, реализации запоздали. Например, в MS SQL они появились только в 2005-ом сервере.
Рекурсивные запросы используют довольно редко, прежде всего, из-за их сложного и непонятного синтаксиса:
with [recursive] <имя_алиаса_запроса> [ (<список столбцов>) ]
as (<запрос>)
<основной запрос>
В MS SQL нет ключевого слова recursive, а в остальном все тоже самое. Такой синтаксис поддерживается в DB2, Sybase iAnywhere, MS SQL и во всех базах данных, которые поддерживают стандарт SQL 99.
Проще разобрать на примере. Предположим, есть таблица:
create table tree_sample (
id integer not null primary key,
id_parent integer foreign key references tree_sample (id),
nm varchar(31) )
id – идентификатор
id_parent – ссылка на родитель
nm – название.
Для вывода дерева:
with recursive tree (nm, id, level, pathstr)
as (select nm, id, 0, cast('' as text)
from tree_sample
where id_parent is null
union all
select tree_sample.nm, tree_sample.id, t.level + 1, tree.pathstr + tree_sample.nm
from tree_sample
inner join tree on tree.id = tree_sample.id_parent)
select id, space( level ) + nm as nm
from tree
order by pathstr
Этот пример выведет дерево по таблице с отступами. Первый запрос из tree_sample этот запрос выдаст все корни дерева. Второй запрос соединяет между собой таблицу tree_sample и tree, которая определяется этим же запросом. Этот запрос дополняет таблицу узлами дерева.
Сначала выполняется первый запрос. Потом к его результатам добавляются результаты второго запроса, где данные таблица tree – это результат первого запроса. Затем снова выполняется второй запрос, но данные таблицы tree – это уже результат предыдущего выполнения второго запроса. И так далее. На самом деле база данных работает не совсем так, но результат будет таким же, как результат работы описанного алгоритма.
После этого данные этой таблицы можно использовать в основном запросе как обычно.
Триггеры. Создание и виды триггеров. Логика СУБД при работе с триггерами. Области применение триггеров. Порядок запуска триггеров. Вложенные триггеры и рекурсивные триггеры.