Правила, значения по умолчанию, представления
Правило – объект базы данных, который связывается со столбцами таблицы и ограничивает их домены. Правило представляет собой выражение, вычисляемое при вставке или обновлении записи. Если это выражение принимает значение FALSE, команда INSERT или UPDATE, ставшая причиной нарушения, отменяется. Команда создания правила:
CREATE RULE <имя правила>
<@Переменная> <оператор> <выражение>
[ { AND | OR } …]
Например:
CREATE RULE rule1
AS @age between 16 and 21
Здесь переменная обозначает позицию, в которую подставляется значение столбца. Имя переменной не влияет на выполнение правила. Удаление правила осуществляется командой DROP RULE <имя правила>. Удаляемое правило исчезает из базы данных. Чтобы использовать правило, необходимо ассоциировать его со столбцами. Этот процесс называется связыванием: Sp_bindrule имя правила, ‘имя таблицы. Имя столбца’
Имена таблиц и столбцов должны заключаться в апострофы, так как аргумент содержит специальный символ – точку.При вызове процедуры устанавливаемое правило не распространяется на данные, уже находящиеся в таблице. После связи правила с таблицей оно начинает действовать автоматически. Если новое правило накладывается поверх предыдущего, оно немедленно вступает в силу. Для разрыва правил со столбцами применяется процедура: Sp_unbindrule имя ‘таблицы.имя столбца’.При вызове этой системной хранимой процедуры не нужно указывать имя правила, так как сервер уже знает, какое правило связано с данным столбцом. Существуют ограничения для правил:
- в правиле могут участвовать только константы, функции и маски редактирования,
- правило не может выполнять просмотр таблицы,
- в правилах не могут сравниваться столбцы таблиц,
- с каждым столбцом может быть связано одно правило,
- если со столбцом связано некоторое правило, оно замещается новым устанавливаемым правилом,
- значения, используемые в правилах, должны быть совместимы с типом данных связанного столбца. При возникновении конфликта снижается быстродействие или возникают ошибки времени выполнения (в зависимости от того, существует ли возможность неявного преобразования типа данных),
- правила не применяются к данным, уже находящимся в таблице, но действуют при обновлении существующих данных,
- правило, связанное со столбцом или пользовательским типом данных, нельзя удалить. Предварительно необходимо разорвать связь правила со всеми столбцами и типами данных,
- рекомендуется использовать ограничения, а не правила.
Значения по умолчанию – объект базы данных, который связывается со столбцами и в базе данных и предоставляет значение столбца в том случае, если столбец отсутствует в команде INSERT. Команда создания значения по умолчанию:
CREATE DEFAULT <имя значения по умолчанию> AS <выражение – константа>
Например:
CREATE DEFAULT adef AS 18
Удаление значения по умолчанию: DROP DEFAULT <имя значения по умолчанию>
Связывание со столбцом: Sp_bindefault <имя значения по умолчанию>, ‘имя таблицы. Имя столбца’. Разрыв связи со столбцом: Sp_unbindefault ‘имя таблицы. Имя столбца’
Ограничения для значений по умолчанию (з.п.у.):
- в определении значения по умолчанию может использоваться лишь одна константа или функция – логические возможности отсутствуют,
- не могут использоваться механизмы принятия решений или просмотра таблицы, в таких случаях следует использовать триггеры,
- с каждым столбцом может быть связано лишь одно значение по умолчанию,
- при попытке задать второе значение по умолчанию для столбца, выдается сообщение по умолчанию,
- тип значения и тип столбца должен совпадать, причем проверка совпадения осуществляется во время выполнения, а не во время создания,
- значения п.у. не применяются к данным, уже находящимся в таблице,
- з.п.у не должны нарушать никаких правил и ограничений столбца, иначе операции вставки не будут выполнены ,
- з.п.у применяются до применения правила,
- з.п.у. не применяются к данным, уже находящимся в таблице,
- з.п.у, связанное со столбцом или пользовательским типом, нельзя удалить, предварительно связь должна быть разорвана со всеми столбцами.
Пользовательский тип – объект базы данных, используемый для описания доменов столбцов базы данных, является производным от стандартных типов данных. Создание пользовательских типов:
sp_addtype имя пользовательского типа данных, системный тип данных,
Null | No Null,
Просмотр пользовательских типов данных: sp_help. Удаление пользовательского типа: sp_droptype <имя типа>
Между правилами могут возникнуть конфликты. Для их разрешения должны быть выработаны определенные соглашения:
--Правила, связанные со столбцом, имеют приоритет выше, чем правила, которые связаны с типом данных.
--Если правило связывается с пользовательским типом данных, оно не замещает правило, связанное со столбцом, характеризуемым этим типом данных.
Представление (Вид) (view) – объект базы данных, но в отличие от таблиц не является физическим хранилищем данных – это логический «вид» физических данных, хранящихся в базе. Его можно представить как хранимое выражение выборки с минимальным набором свойств. Удаление всего представления как объекта никак не повлияет на данные, на основе которых оно построено. В то же время удаление всех записей в представлении может удалить эти записи в исходных таблицах. После определения вида на него можно ссылаться так же, как и на таблицу. Вид не создает постоянную копию выбранных строк и столбцов базы данных. Если в какой-нибудь инструкции вместо имени таблицы указать имя вида, то выполнится инструкция select, входящая в определение вида и после этого создается временная таблица, которая и отображается на экране. Таким образом, при ссылке на вид выполняется заданная в определении вида инструкция Select. Если вы добавляете столбцы в таблицы, лежащие в основе вида, новые столбцы не появляются в нем до тех пор, пока вы сначала его не удалите и затем снова не определите. Рекомендуется в имени вида добавлять префикс “vw_имя”, иначе объект внешне выглядит как таблица. Виды можно использовать для обеспечения безопасности базы данных. Можно предjставить такие права доступа к видам, которые будут отличаться от прав доступа к таблицам, лежащим в основе вида. Команда создания вида:
CREAT VIEW <имя вида>
[WITH ENCRYPT]
AS SELECT <инструкция>
[WITH CHECK OPTION]
Здесь опция WITH ENCRYPTION лишает пользователя возможности отображать определение вида в системной таблице Syscomments (то есть никто, кроме создателя вида не может посмотреть его код). При отсутствии этой опции после создания вида его определение сохраняется в системной таблице Syscomments. Для отображения этой информации может использоваться хранимая системная процедура sp_helptext <имя вида>. Просмотреть определение зашифрованного вида невозможно ни одним из способов. Недостатком шифрования определений вида является то, что такие виды не могут воссоздаться при обновлении базы данных или SQL Server. Шифровка используется для безопасности данных, чтобы лишить пользователя возможности просматривать объекты базы данных. Ограничения на использование и определение видов (по поводу команды Select):
1. Нельзя определить вид временной таблицы – это перевалочные структуры базы данных и они существуют только до тех пор, пока данные считываются из постоянных таблиц.
2. Для вида нельзя определить триггер (триггер – объект базы данных, которым автоматически выполняется при добавлении, обновлении и удалении строк таблицы.)
3. Нельзя включать в определение вида ORDER BY. Строки в виде неупорядочены. Если бы внутри вида можно было использовать инструкцию Select с предложением ORDER BY, строки получившегося вида стали бы упорядоченными и вид стал бы отличаться от стандартной таблицы базы данных, где данные неупорядочены (хотя секция может быть использована при выборке из вида).
4. В виде нельзя использовать предложение COMPUTE.
5. Внутрь вида нельзя включать предложение Distinct команды Select. Уникальность считываемых с помощью вида строк можно обеспечить, если в таблице, на которую ссылается вид, определить уникальный ключ или индекс.
6. Нельзя использовать внутри вида предложение INTO, т.е. вывод строк не на экран, а в другую таблицу.
Иногда виды делят на простые и составные виды (simple view) определяют для доступа к одной таблице, составные виды (complex view)- доступ к нескольким таблицам, тогда в команде FROM присутствуют несколько таблиц. В некоторых случаях вы можете так изменить данные, что они больше не будут удовлетворять условиям выборки в представлении. Опция WITH CHECK OPTION позволяет контролировать измененные данные, так чтобы критерий выборки не нарушался. Эта опция – работает с командами UPDATE, INSERT и DELETE. (запрещает пользователям вставку и обновление записей, не входящих в представление, разрешает модификацию записей, входящих в представление). Для модификации видов используется команда:
ALTER VIEW <имя представления>
[ with encryption ]
AS < команда select>
[WITH CHECK OPTION]
Команда изменяет существующее представление и не влияет на зависящие от него хранимые процедуры или триггеры, а также не изменяет прав пользователей. Эта команда относится к новым возможностям последней версии SQL Server и позволяет модифицировать представления без их удаления и повторного создания. Представление, используемое в настоящий момент, модифицировать нельзя. Удаление видов осуществляется командой: DROP VIEW <имя_вида>. Удаление вида не влияет на постоянные таблицы, лежащие в их основе, определение вида удаляется из базы данных. Если вы удалите вид, указанный в определение другого вида, то при последующей ссылке на него появится сообщение об ошибке. Можно создать вид, ссылающейся на несколько видов и таблиц. Модификация данных с помощью видов возможна только для простых видов. Вставленные с помощью вида строки можно вставлять даже тогда, когда они не удовлетворяют критерию, заданному в предложении Where внутри определения вида, а вот считать такую строку с помощью этого вида не удастся. Чтобы не запутаться, к определению вида можно добавить предложение WITH CHECK OPTION, которое запрещает операцию добавления строки посредством вида, если впоследствии с помощью того же вида строку невозможно отобразить. Если при добавлении в вид определяются не все столбцы, т.е. один или несколько столбцов в виде не заданы, тогда эти столбцы должны допускать значения NULL или Default, иначе строка не будет добавлена. С помощью видов можно удалить строки, даже если в этом виде происходит обращение не ко всем столбцам таблицы. Delete from <имя_вида> WHERE <условие>. Невозможно выполнить операцию удаления строк посредством вида, если в критерии, заданном в предложении WHERE определения вида, не указаны строки, которые вы собираетесь удалять, указывая их в предложении WHERE у инструкции DELETE. Поэтому для запрещения удаления строк, которые не удовлетворяют условию WHERE опцию WITH CHECK OPTION не обязательно. Невозможно удалить строку из таблицы посредством вида, если столбец, заданный в предложении WHERE инструкции DELETE, не указан в определении вида. Строки можно удалять непосредственно из таблицы, входящей в определение вида. Любые изменения, сделанные посредством вида, будут выполнены в таблице, указанной в определении вида. Рекомендуется доступ к базам данных осуществлять через виды (в иерархических и сетевых базах данных данными можно было манипулировать только через виды сущностей, в сетевой модели данных было понятие подсхем – аналог видов). В видах невозможно обновлять столбцы, которые используются в таблицах для создания парных строк, поскольку такие столбцы являются частью разных таблиц. Чтобы обновить столбцы, которые относятся одновременно к двум таблицам, можно с помощью вида обновить значение в одном столбце, а для обновления соответствующего значения в связанном столбце использовать триггер. Определение вида останется в базе данных, даже если лежащая в его основе таблица будет удалена, хотя при обращении к виду будет сообщение об ошибке. Нельзя модифицировать данные в составном виде. Ограничения при создании видов:
- представления могут создаваться только в той базе данных, которую вы используете, хотя к представлениям можно обращаться и из других баз – для этого надо ввести полностью определенное имя представления,
- необходимо указать имя для каждого столбца в представлении, если любой столбец представления является производным от константы, встроенной функции или математического выражения, если два и более столбца таблицы имеют одинаковые имена, если вы хотите переименовать столбец,
- представление может содержать до 1024 столбцов (раньше – 255),
- при обновлении столбцов записи через представление каждая команда UPDATE должна обновлять лишь одну базовую таблицу (она может ссылаться на несколько таблиц, но должна обновлять только одну).
Представления могут использоваться для упрощения кода, как средство горизонтальной защиты, как средство вертикальной защиты, для маскировки данных, для маскировки изменений в базе данных.