Введение в стандарты языка баз данных SQL

         

Оператор закрытия курсора, связанного с динамически подготовленным оператором выборки


<dynamic close statement> ::= C LOSE <dynamic cursor name>

Пояснения:

По сути, оператор закрытия курсора, связанного с динамически подготовленным оператором SQL, отличается от статического случая только тем, что имя курсора может задаваться через переменную.



Оператор запроса описания подготовленного оператора


<describe statement> ::= <describe input statement> <describe output statement> <describe input statement> ::= DESCRIBE INPUT <SQL statement name> <using descriptor> <describe output statement> ::= DESCRIBE [OUTPUT] <SQL statement name> <using descriptor> <using clause> ::= <using arguments> <using descriptor> <using arguments> ::= { USING | INTO } <argument> [{<comma> <argument>}...] <argument> ::= <target specification> <using descriptor> ::= { USING | INTO } SQL DESCRIPTOR <descriptor name> <target specification> ::= <parameter specification> | <variable specification> <parameter specification> ::= <parameter name> [<indicator parameter>] <indicator parameter> ::= [INDICATOR] <parameter name> <variable specification> ::= <embedded variable name> [<indicator variable>] <indicator variable> ::= [INDICATOR] <embedded variable name>

Пояснения:

При выполнении оператора DESCRIBE происходит заполнение указанного в операторе дескриптора информацией, описывающей либо результат ранее подготовленного оператора SQL (если это оператор выборки), либо количество и типы параметров подготовленного оператора. В <usingdescriptor> здесь полагается писать USINGSQLDESCRIPTOR.



Операторы окончания транзакции


Текущая транзакция может быть завершена успешно (с фиксацией в базе данных произведенных изменений) путем выполнения оператора COMMITWORK или аварийно (с удалением из базы данных изменений, произведенных текущей транзакцией) путем выполнения оператора ROLLBACKWORK. При выполнении любого из этих операторов производится принудительное закрытие всех курсоров, открытых к моменту выполнения оператора завершения транзакции.



Операторы определения и изменения определения домена


Эти операторы служат для определения домена, который в дальнейшем можно использовать для определения столбцов. Оператор определения (создания) домена имеет следующий синтаксис:

<domain definition> ::= C REATE DOMAIN <domain name> [ AS ] <data type> [ <default clause> ] [ <domain constraint>... ] [ <collate clause> ] <domain constraint> ::= [ <constraint name definition> ] <check constraint definition> [ <constraint attributes> ]

Синтаксис раздела умолчаний совпадает с синтаксисом раздела умолчаний в определении столбца (см. п. 3.5.1).

Пояснения:

Пусть D1 - некоторый домен. D1 используется в ограничении домена DC в том и только в том случае, когда условие поиска DC содержит либо имя D1, либо имя некоторого ограничения домена D2. Домен не может использоваться в своем собственном ограничении. Для каждого ограничения домена



(a) если атрибуты ограничения неспецифицированы, неявно полагаются указанными атрибуты INITIALLYIMMEDIATENOTDEFERRABLE.

(b) если неспецифицировано имя ограничения, по умолчанию неявно предполагается указание имени ограничения, зависящего от реализации.

Пусть DSC обозначает условие поиска, входящее в ограничение домена DCD. Пусть D - имя этого домена, а T - имя некоторой таблицы со столбцом C, определенным на домене D. Пусть CSC обозначает копию DSC, в которой каждое вхождение VALUE заменено на C. Ограничение DCD не удовлетворяется для C в том и только в том случае, когда истинно условие EXISTS (SELECT * FROMTWHERENOT (CSC)).

Оператор изменения определения домена определяется следующими синтаксическими правилами:

<alter domain statement> ::= ALTER DOMAIN <domain name> <alter domain action> <alter domain action> ::= <set domain default clause> |<drop domain default clause> |<add domain constraint definition> |<drop domain constraint definition>

Пояснение:

В результате выполнения оператора ALTERDOMAIN описание существующего домена изменяется в соответствии со специфицированным действием.

Раздел установки значения по умолчанию имеет следующий синтаксис:


<set domain default clause> ::= SET <default clause>

В результате в описатель домена заносится указанное значение по умолчанию (синтаксис раздела умолчания см. в п. 3.5.1).

Раздел уничтожения значения по умолчанию имеет следующий синтаксис:

<drop domain default clause> ::= DROP DEFAULT

Пояснения:

Описатель соответствующего домена должен содержать значение по умолчанию. Пусть C обозначает множество столбцов, определенных на данном домене. Для каждого столбца из C, если в его описателе не содержится значение по умолчанию, в него помещается значение по умолчанию из описателя домена. Из описателя домена значение по умолчанию удаляется.

Определению добавления ограничения домена соответствует следующее синтаксическое правило:

<add domain constraint definition> ::= ADD <domain constraint>

Определение не требует пояснений.

Определению уничтожения ограничения домена соответствует следующее синтаксическое правило:

<drop domain constraint definition> ::= DROP CONSTRAINT <constraint name>

Смысл этого определения также очевиден.


Определение ограничений целостности


В стандарте SQL/92 специфицированы две разновидности ограничений целостности - привязанные к определению таблиц (табличные ограничения) и определяемые независимо (утверждения целостности - assertions). Табличные ограничения похожи на соответствующие средства SQL/89, но на самом деле существенно более развиты. Поэтому мы достаточно подробно рассмотрим эти механизмы. Аналогов утверждений целостности в языке SQL/89 не было.

Общие синтаксические правила определения табличных ограничений выглядят следующим образом:

<table constraint definition> ::= [ <constraint name definition> ] <table constraint> [ <constraint attributes> ] <table constraint> ::= <unique constraint definition> |<referential constraint definition> |<check constraint definition>

Синтаксические правила разделов определения имени и атрибутов ограничения приведены в п.3.5.1.

Пояснения:

Если атрибуты ограничения не специфицированы, то неявно предполагается наличие атрибута INITIALLYIMMEDIATENOTDEFERRABLE. Если не специфицировано определение имени ограничения, то неявно предполагается наличие определения имени ограничения с именем, зависящим от реализации.

Ограничение уникальности определяется следующими синтаксическими правилами:

<unique constraint definition> ::= <unique specification> <left paren> <unique column list> <right paren> <unique specification> ::= UNIQUE | PRIMARY KEY <unique column list> ::= <column name list>

Пояснения:

Пусть T обозначает таблицу, для которой определяется ограничение уникальности, а UCL - список столбцов уникальности. Если в спецификации уникальности содержится ключевое слово PRIMARYKEY, то пусть SC обозначает условие поиска UNIQUE (SELECTUCLFROMT) AND (UCL) ISNOTNULL Если в спецификации уникальности содержится ключевое слово UNIQUE, то пусть SC обозначает условие поиска UNIQUE (SELECTUCLFROMT) Определение таблицы должно содержать не более одного явного или неявного определения ограничения уникальности со спецификацией PRIMARYKEY. Ограничение уникальности не удовлетворяется в том и только в том случае, когда истинно условие EXISTS (SELECT * FROMTWHERENOT (SC))


Ссылочное ограничение определяется следующими синтаксическими правилами:

<referential constraint definition> ::= FOREIGN KEY <left paren> <referencing columns> <right paren> <references specification> <references specification> ::= REFERENCES <referenced table and columns> [ MATCH <match type> ] [ <referential triggered action> ] <match type> ::= FULL PARTIAL <referencing columns> ::= <reference column list> <referenced table and columns> ::= <table name> [ <left paren> <reference column list> <right paren> ] <reference column list> ::= <column name list> <referential triggered action> ::= <update rule> [ <delete rule> ] |<delete rule> [ <update rule> ] <update rule> ::= ON UPDATE <referential action> <delete rule> ::= ON DELETE <referential action> <referential action> ::= CASCADE |SET NULL |SET DEFAULT |NO ACTION

Пояснения:

Ссылающейся таблицей мы будем называть таблицу, фигурирующую в определении таблицы или изменении схемы таблицы (операторе ALTERTABLE). Таблицей, на которую указывает ссылка, будем называть таблицу, имя которой указывается в разделе referencedtableandcolumns. Ссылающимися столбцами будем называть столбцы, перечисленные в списке столбцов-ссылок (referencecolumnlist). Если в разделе referencedtableandcolumns специфицирован список столбцов, то набор имен столбцов из этого списка должен совпадать с набором столбцов уникальности, содержащемся в ограничении уникальности таблицы, на которую указывает ссылка. Если раздел referencedtableandcolumns не содержит списка столбцов, то для таблицы, на которую указывает ссылка, должно быть определено ограничение уникальности с ключевым словом PRIMARYKEY. Ограничение уникальности для таблицы, на которую указывает ссылка, должно не быть откладываемым. Таблица, на которую указывает ссылка, должна быть базовой и,

(a) если ссылающаяся таблица является постоянной базовой, то и таблица, на которую указывает ссылка, должна быть постоянной базовой;



(b) если ссылающаяся таблица является глобальной временной, то и таблица, на которую указывает ссылка, должна быть глобальной временной;

(c) если ссылающаяся таблица является создаваемой локальной временной, то и таблица, на которую указывает ссылка, должна быть создаваемой локальной временной;

(d) если ссылающаяся таблица является объявляемой локальной временной, то таблица, на которую указывает ссылка, должна быть либо глобальной временной, либо создаваемой локальной временной, либо объявляемой локальной временной.



Если таблица, на которую указывает ссылка является временной со спецификацией ONCOMMITDELETEROWS, то и для ссылающейся таблицы должно быть специфицировано ONCOMMITDELETEROWS. В списке ссылающихся столбцов должно содержаться то же число имен столбцов, что задается разделом referencedtableandcolumns. i-тый столбец, идентифицируемый списком ссылающихся столбцов соответствует i-тому столбцу, идентифицированному в разделе referencedtableandcolumns. Типы данных соответствующих столбцов должны совпадать. Если в определении ссылочного ограничения не специфицировано правило модификации (updaterule), то по умолчанию предполагается наличие такого правила с действием NOACTION. Если в определении ссылочного ограничения не специфицировано правило удаления (deleterule), то по умолчанию предполагается наличие такого правила с действием NOАCTION. Пусть Rf обозначает ссылающиеся столбцы, а Rt - соответствующие столбцы в таблице, на которую указывает ссылка. Ссылающаяся таблица и таблица, на которую указывает ссылка, удовлетворяют ссылочному ограничению в том и только в том случае, когда:

(a) тип соответствия (matchtype) не указан, и для каждой строки ссылающейся таблицы истинно условие RfMATCH (SELECTRtFROMT);

(b) указан тип соответствия PARTIAL, и для каждой строки ссылающейся таблицы истинно условие RfMATCHPARTIAL (SELECTRtFROMT);

(c) указан тип соответствия FULL, и для каждой строки ссылающейся таблицы истинно условие RfMATCHFULL (SELECTRtFROMT).



Если не указан тип соответствия или если указан тип соответствия FULL, то для данной строки таблицы, на которую указывает ссылка, соответствующими являются все строки ссылающейся таблицы, значения полей ссылающихся столбцов которых равны значениям соответствующих столбцов строки, на которую указывает ссылка. Если указан тип соответствия PARTIAL, то



для данной строки таблицы, на которую указывает ссылка, соответствующими являются все строки ссылающейся таблицы, содержащие по крайней мере одно не неопределенное значение ссылающегося столбца, причем все не неопределенные значения столбцов этих строк совпадают со значениями соответствующих столбцов строки, на которую указывает ссылка;

для данной строки таблицы, на которую указывает ссылка, уникально соответствующими являются все соответствующие только ей строки; другие соответствующие строки называются неуникально соответствующими.



Для каждой строки таблицы, на которую указывает ссылка, соответствующие, уникально и неуникально соответствующие ей строки определяются непосредственно до выполнения любого оператора SQL. Во время выполнения оператора новые соответствующие строки не добавляются. Связь между неуникально соответствующими строками уничтожается в ходе выполнения оператора SQL, если строка, на которую ведет ссылка помечается для удаления или для изменения значения любого столбца, соответствующего не неопределенному ссылающемуся столбцу. Это происходит сразу после такой пометки. Сразу после этого происходит обнаружение новых уникально или неуникально соответствующих строк. Если специфицировано правило удаления, и строка таблицы, на которую указывает ссылка, помечается для удаления, то

(a) если тип соответствия не специфицирован или если специфицирован тип соответствия FULL, то

(i) если в правиле удаления указано CASCADE, то все соответствующие строки помечаются для удаления;

(ii) если в правиле удаления указано SETNULL, то во всех соответствующих строках в каждый ссылающийся столбец заносится неопределенное значение;

(iii) если в правиле удаления указано SETDEFAULT, то во всех соответствующих строках в каждый ссылающийся столбец заносится соответствующее значение по умолчанию;

(b) если специфицирован тип соответствия PARTIAL, то

(i) если в правиле удаления указано CASCADE, то все уникально соответствующие строки помечаются для удаления;

(ii) если в правиле удаления указано SETNULL, то во всех уникально соответствующих строках в каждый ссылающийся столбец заносится неопределенное значение;



(iii) если в правиле удаления указано SETDEFAULT, то во всех уникально соответствующих строках в каждый ссылающийся столбец заносится соответствующее значение по умолчанию.



Если специфицировано правило модификации, и не неопределенное значение столбца в таблице, на которую указывает ссылка, изменяется на некоторое другое значение, то

(a) если тип соответствия не специфицирован или если специфицирован тип соответствия FULL, то

(i) если в правиле удаления указано CASCADE, то во всех соответствующих столбцах проставляется то же самое новое значение;

(ii) если в правиле модификации указано SETNULL, то

(*) если тип соответствия не указан, то во всех соответствующих строках в ссылающийся столбец, соответствующий измененному столбцу таблицы, на которую указывает ссылка, выставляется неопределенное значение;

(**) если указан тип соответствия FULL, то во всех соответствующих строках в каждый ссылающийся столбец заносится неопределенное значение;

(iii) если в правиле модификации указано SETDEFAULT, то во всех соответствующих строках в ссылающийся столбец, соответствующий измененному столбцу таблицы, на которую указывает ссылка, заносится значение по умолчанию;

(b) если указан тип соответствия PARTIAL, то

(i) если в правиле модификации указано CASCADE, то для каждой уникально соответствующей строки, содержащей не неопределенное значение в ссылающемся столбце C1, который соответствует изменяемому столбцу C2, в столбец C1 заносится новое значение столбца C2;

(ii) если в правиле модификации указано SETNULL, то во всех уникально соответствующих строках, содержащих не неопределенное значение в ссылающемся столбце, который соответствует изменяемому столбцу, проставляется неопределенное значение;

iii) если в правиле модификации указано SETDEFAULT, то во всех уникально соответствующих строках, содержащих не неопределенное значение в ссылающемся столбце, который соответствует изменяемому столбцу, проставляется значение по умолчанию;



Все строки, помеченные для удаления, реально удаляются в конце выполнения оператора SQL до проверки каких-либо ограничений целостности.



Проверочное ограничение целостности определяется следующим синтаксическим правилом:

<check constraint definition> ::= CHECK <left paren> <search condition> <right paren>

Пояснения:

Условие поиска не должно содержать спецификации цели и спецификации динамического параметра, а также спецификации агрегатной функции, не содержащейся в подзапросе. Если определение проверочного ограничения содержится в операторе определения временной таблицы со спецификацией ONCOMMITPRESERVEROWS или в операторе определения временной таблицы со спецификацией ONCOMMITPRESERVEROWS, то никакой подзапрос в условии поиска не должен ссылаться на временную таблицу, определенную или объявленную со спецификацией ONCOMMITDELETEROWS.

Утверждения целостности определяются следующими синтаксическими правилами:

<assertion definition> ::= CREATE ASSERTION <constraint name> <assertion check> [ <constraint attributes> ] <assertion check> ::= CHECK <left paren> <search condition> <right paren>

Пояснения:

Если в определении утверждения целостности не специфицированы атрибуты ограничения, то по умолчанию принимаются атрибуты INITIALLYIMMEDIATENOTDEFERRABLE. Условие поиска не должно содержать спецификацию цели или спецификацию динамического параметра. Никакое выражение запроса в условии поиска не должно содержать ссылку на временную таблицу. Утверждение целостности не удовлетворяется в том и только в том случае, когда результат вычисления условия поиска есть false.


Определение ограничений целостности таблицы


Ограничения целостности таблицы обладают следующим синтаксисом:

<table constraint definition> ::= <unique constraint definition> |<referential constraint definition> |<check constraint definition> <unique constraint definition> ::= <unique specification> (<unique column list>) <unique specification> ::= UNIQUE PRIMARY KEY <unique column list> ::= <column name> [{,<column name>}...] <referential constraint definition> ::= FOREIGN KEY (<referencing columns>) <references specification> <references specification> ::= REFERENCES <referenced table and columns> <referencing columns> ::= <reference column list> <referenced table and columns> ::= <table name> [(<reference column list>)] <reference column list> ::= <column name> [{,<column name>}...] <check constraint definition> ::= CHECK (<search condition>)

Для одной таблицы может быть задано несколько ограничений целостности, в том числе те, которые неявно порождаются ограничениями целостности столбцов. Стандарт SQL/89 устанавливает, что ограничения таблицы фактически проверяются при выполнении каждого оператора SQL.

Замечание: Наличие правильно подобранного набора ограничений БД очень важно для надежного функционирования прикладной информационной системы. Вместе с тем, в некоторых СУБД ограничения целостности практически не поддерживаются. Поэтому при проектировании прикладной системы необходимо принять решение о том, что более существенно: рассчитывать на поддержку ограничений целостности, но ограничить набор возможных СУБД, или отказаться от их использования на уровне SQL, сохранив возможность использования не самых современных СУБД.

Далее T обозначает таблицу, для которой определяются ограничения целостности.



Определение представлений


Механизм представлений (view) является мощным средством языка SQL, позволяющим скрыть реальную структуру БД от некоторых пользователей за счет определения представления БД, которое реально является некоторым хранимым в БД запросом с именованными столбцами, а для пользователя ничем не отличается от базовой таблицы БД (с учетом технических ограничений). Любая реализация должна гарантировать, что состояние представляемой таблицы точно соответствует состоянию базовых таблиц, на которых определено представление. Обычно вычисление представляемой таблицы (материализация соответствующего запроса) производится каждый раз при использовании представления.

В стандарте SQL/89 оператор определения представления имеет следующий синтаксис:

<view definition> ::= CREATE VIEW <table name> [(<view column list>)] AS <query specification> [WITH CHECK OPTION] <view column list> ::= <column name> [{,<column name>}...]

Определяемая представляемая таблица V является обновляемой (т.е. по отношению к V можно использовать операторы DELETE и UPDATE) в том и только в том случае, если выполняются следующие условия для спецификации запроса:

в списке выборки не указано ключевое слово DISTINCT; каждое арифметическое выражение в списке выборки представляет собой одну спецификацию столбца, и спецификация одного столбца не появляется более одного раза; в разделе FROM указана только одна таблица, являющаяся либо базовой таблицей, либо обновляемой представляемой таблицей; в условии выборки раздела WHERE не используются подзапросы; в табличном выражении отсутствуют разделы GROUPBY и HAVING.

Замечание: Эти ограничения являются очень сильными. В реализациях они могут быть ослаблены. Но если стремиться к мобильности, не следует пользоваться расширенными возможностями.

Если в списке выборки спецификации запроса имеется хотя бы одно арифметическое выражение, состоящее не из одной спецификации столбца, или если одно имя столбца участвует в списке выборки более одного раза, определение представления должно содержать список имен столбцов представляемой таблицы. Если выражаться более лаконично, это означает, что нужно явно именовать столбцы представляемой таблицы, если эти имена не наследуются от столбцов таблиц раздела FROM спецификации запроса.

Требование WITHCHECKOPTION в определении представления имеет смысл только в случае определения обновляемой представляемой таблицы, которая определяется спецификацией запроса, содержащей раздел WHERE. При наличии этого требования не допускаются обновления представляемой таблицы, которые приводят к появлению в базовых таблицах строк, не видимых в представляемой таблице (т.е. таких строк, которые не удовлетворяют условию поиска раздела WHERE спецификации запроса). Если WITHCHECKOPTION в определении представления отсутствует, такой контроль не производится.



Определение представления


На этом занятии мы определим только самые простые представления над созданными таблицами. Более сложные возможности отложим до получения навыков составления запросов.

Каждый слушатель должен определить представление my_viewn, где n - номер слушателя с двумя столбцами: col1, соответствующим столбцу book_id таблицы my_lib0, и col2 со значением, равным сумме book_val и pen_val.

Проверьте, что через созданное представление выбираются две строки, соответствующие строкам, ранее занесенным в таблицу my_libn.



Определение привилегий


В соответствии с идеологией языка SQL контроль прав доступа данного пользователя к таблицам БД производится на основе механизма привилегий. Фактически, этот механизм состоит в том, что для выполнения любого действия над таблицей пользователь должен обладать соответствующей привилегией (реально все возможные действия описываются фиксированным стандартным набором привилегий). Пользователь, создавший таблицу, автоматически становится владельцем всех возможных привилегий на выполнение операций над этой таблицей. В число этих привилегий входит привилегия на передачу всех или некоторых привилегий по отношению к данной таблице другому пользователю, включая привилегию на передачу привилегий. Иногда поддерживается и обратная операция изъятия привилегий от пользователя, ранее их получившего.

В SQL/89 определяется упрощенная схема механизма привилегий. Во-первых, "раздача" привилегий возможна только при определении таблицы. Во-вторых, пользователь, получивший некоторые привилегии от других пользователей, может передать их дальше только при определении схемы.

Определение привилегий производится в следующем синтаксисе:

<privilege definition> ::= GRANT <privileges> ON <table name> TO <grantee> [{,<grantee>}...] [WITH GRANT OPTION] <privileges> ::= ALL PRIVILEGES |<action> [{,<action>}...] <action> ::= SELECT INSERT DELETE |UPDATE [(<grant column list>)] |REFERENCES [(<grant column list>] <grant column list> ::= <column name> [{,<column name>}...] <grantee> ::= PUBLIC <authorization identifier>

Смысл механизма определения привилегий в SQL/89 достаточно понятен из этого синтаксиса. Заметим лишь, что привилегией REFERENCES по отношению к указанным столбцам таблицы T1 необходимо обладать, чтобы иметь возможность при определении таблицы T определить ограничение по ссылкам между этой таблицей и существующей к этому моменту таблицей T1.

Еще раз заметим, что хотя в общем смысле во всех SQL-ориентированных СУБД поддерживается механизм защиты доступа на основе привилегий, реализации могут различаться в деталях. Это опять то место, которое нужно локализовывать, если стремиться к созданию мобильной прикладной системы.



Определение процедуры


Процедуры в модуле SQL определяются в следующем синтаксисе:

<procedure> ::= PROCEDURE <procedure name> <parameter declaration>...; <SQL statement>; <parameter declaration>::= <parameter name> <data type> |<SQLCODE parameter> <SQLCODE parameter> ::= SQLCODE <SQL statement> ::= <close statement> |<commit statement> |<delete statement positioned> |<delete statement searched> |<fetch statement> |<insert statement> |<open statement> |<rollback statement> |<select statement> |<update statement positioned> |<update statement searched>

Имена всех процедур в одном модуле должны быть различны. Любое имя параметра, содержащегося в операторе SQL процедуры, должно быть специфицировано в разделе объявления параметров. Число фактических параметров при вызове процедуры должно совпадать с числом формальных параметров, указанных при ее объявлении. Список формальных параметров каждой процедуры должен содержать ровно один параметр SQLCODE (код ответа процедуры; возможные значения кодов ответа стандартизованы, но некоторые из них определяются в реализации).



Определение столбца


Оператор определения столбца описывается следующими синтаксическими правилами:

<column definition> ::= <column name> <data type> [<default clause>] [<column constraint>...] <default clause> ::= DEFAULT { <literal> USER NULL } <column constraint> ::= NOT NULL [<unique specification>] |<references specification> |CHECK (<search condition>)

Как видно, кроме обязательной части, в которой определяется имя столбца и его тип данных, определение столбца может содержать два необязательных раздела: раздел значения столбца по умолчанию и раздел ограничений целостности столбца.

В разделе значения по умолчанию указывается значение, которое должно быть помещено в строку, заносимую в данную таблицу, если значение данного столбца явно не указано. Значение по умолчанию может быть указано в виде литеральной константы с типом, соответствующим типу столбца; путем задания ключевого слова USER, которому при выполнении оператора занесения строки соответствует символьная строка, содержащая имя текущего пользователя (в этом случае столбец должен иметь тип символьных строк); или путем задания ключевого слова NULL, означающего, что значением по умолчанию является неопределенное значение. Если значение столбца по умолчанию не специфицировано, и в разделе ограничений целостности столбца указано NOTNULL, то попытка занести в таблицу строку с неспецифицированным значением данного столбца приведет к ошибке.

Указание в разделе ограничений целостности NOTNULL приводит к неявному порождению проверочного ограничения целостности для всей таблицы (см. следующий подраздел) "CHECK (CISNOTNULL)" (где C - имя данного столбца). Если ограничение NOTNULL не указано, и раздел умолчаний отсутствует, то неявно порождается раздел умолчаний DEFAULTNULL. Если указана спецификация уникальности, то порождается соответствующая спецификация уникальности для таблицы.

Если в разделе ограничений целостности указано ограничение по ссылкам данного столбца (<referencespecification>), то порождается соответствующее определение ограничения по ссылкам для таблицы:

FOREIGNKEY(C) <referencespecification>.

Наконец, если указано проверочное ограничение столбца, то условие поиска этого ограничения должно ссылаться только на данный столбец, и неявно порождается соответствующее проверочное ограничение для всей таблицы.



Определение таблицы


Оператор определения таблицы имеет следующий синтаксис:

<table definition> ::= CREATE TABLE <table name> (<table element> [{,<table element>}...]) <table element> ::= <column definition> |<table constraint definition>

Кроме имени таблицы, в операторе специфицируется список элементов таблицы, каждый из которых служит либо для определения столбца, либо для определения ограничения целостности определяемой таблицы. Требуется наличие хотя бы одного определения столбца. Оператор CREATETABLE определяет так называемую базовую таблицу, т.е. реальное хранилище данных.

Для определения столбцов таблицы и ограничений целостности используются специальные операторы, которые должны быть вложены в оператор определения таблицы.


Пояснения:

Определение столбца может входить в определение таблицы, объявление временной таблицы и в оператор изменения схемы таблицы (ALTERTABLE). Пусть T обозначает соответствующую таблицу. Имя столбца в определении столбца должно отличаться от имени любого существующего столбца таблицы T. i-тый столбец таблицы описывается i-тым определением столбца в определении таблицы. Имя и тип данных или домен столбца специфицируется именем столбца и типом данных или именем домена соответственно. Пусть C - имя столбца из определения столбца. Если в определение столбца входит определение ограничения столбца, то пусть CND обозначает определение имени ограничения, если оно задано, а иначе пусть соответствует строке нулевой длины; пусть CA обозначает атрибуты ограничения, если они заданы, а иначе пусть соответствует строке нулевой длины. Определение ограничения столбца эквивалентно следующим определениям ограничения таблицы:

(a) если определение ограничения столбца содержит ограничение столбца NOTNULL, то оно эквивалентно ограничению таблицы CNDCHECK (CISNOTNULL) CA;

(b) если определение ограничения столбца содержит спецификацию уникальности, то оно эквивалентно определению ограничения таблицы, содержащему CND <uniquespecification> (C) CA

(c) если определение ограничения столбца содержит спецификацию ссылок (referencesspecification), то оно эквивалентно следующему табличному ограничению: CNDFOREIGNKEY (C) <referencesspecification> CA

(d) если определение ограничения столбца содержит определение проверочного ограничения, то оно эквивалентно определению табличного ограничения CNDCHECK (<searchcondition>) CA; при этом каждая ссылка на столбец, непосредственно содержащаяся в условии поиска, должна указывать на столбец C.



При определении столбца можно указать значение, которое должно присваиваться этому столбцу по умолчанию, если при занесении новых строк в соответствующую таблицу значение данного столбца не задается явно. Раздел умолчаний определяется следующим синтаксисом:

<default clause> ::= DEFAULT <default option> <default option> ::= <literal> |<datetime value function> |USER |CURRENT_USER |SESSION_USER |SYSTEM_USER NULL

Смысл этой конструкции ясен из синтаксических правил.


Основные понятия


В отдельном разделе стандарта описываются основные понятия, на которые он опирается. Как кажется, знакомство с этой частью стандарта очень полезно для общего понимания сути языка.

3.1.1. Типы данных

В стандарте тип данных определяется как множество представляющих его значений. Логическим представлением значения является литерал. Физическое представление зависит от реализации. В языке SQL значение любого типа является примитивным в том смысле, что в соответствии со стандартом оно не может быть логически разбито на другие значения. Значения могут быть определенными или неопределенными. Неопределенное значение - это зависящее от реализации значение, которое гарантированно отлично от любого определенного значения соответствующего типа. Можно считать, что имеется всего одно неопределенное значение, входящее в любой тип данных языка SQL. Для неопределенного значения отсутствует представляющий его литерал, хотя в некоторых случаях используется ключевое слово NULL для выражения того, что желательно именно неопределенное значение.

В SQL/92 определяются различные типы данных, обозначаемые следующими ключевыми словами: CHARACTER, CHARACTERVARYING, BIT, BITVARYING, NUMERIC, DECIMAL, INTEGER, SMALLINT, FLOAT, REAL, DOUBLEPRECISION, DATE, TIME, TIMESTAMP и INTERVAL.

Типы данных CHARACTER и CHARACTERVARYING совместно называются типами данных символьных строк; типы данных BIT и BITVARYING - типами данных битовых строк. Типы данных символьных строк и типы данных битовых строк совместно называются строчными типами данных, а значения строчных типов называются строками.

Типы данных NUMERIC, DECIMAL, INTEGER и SMALLINT совместно называются типами данных точных чисел. Типы данных FLOAT, REAL и DOUBLEPRECISION совместно называются типами данных приблизительных чисел. Типы данных точных чисел и типы данных приблизительных чисел совместно называются числовыми типами. Значения числовых типов называются числами.

Типы данных DATE, TIME и TIMESTAMP совместно называются типами даты-времени. Значения типов даты-времени называются "дата-время". Тип данных INTERVAL называется интервальным типом.



Особенности текущих реализаций


В настоящее время SQL реализован практически во всех коммерческих реалиционных СУБД, все фирмы провозглашают соответствие своей реализации стандарту SQL, и на самом деле реализованные диалекты SQL очень близки (хотя и не полностью совпадают). Это произошло не сразу и не просто.

Наиболее близкими к SystemR являлись две системы фирмы IBM - SQL/DS и DB2. Как кажется (документальных подтверждений этому автор не имеет), обе эти системы прямо использовали реализацию SystemR. Отсюда предельная близость реализованных диалектов SQL к SQLSystemR. Из SQLSystemR были удалены только те части, которые были недостаточно проработаны (например, точки сохранения) или реализация которых вызывала слишком большие технические трудности (например, ограничения целостности и триггеры). Можно назвать этот путь к коммерческой реализации SQL движением сверху вниз. (Кстати, заметим, что в последнее время компания IBM сделала важный шаг вперед для более широкого распространения своих продуктов управления базами данных. После переноса DB2 на платформу RS/6000 компания стала обращать большее внимание на линию открытых систем, и весной 1997 г. было объявлено, что DB2 может теперь работать на платформах SunMicrosystems и HewlettPackard.)

Другой подход применялся в таких системах, как Oracle и Informix. Несмотря на различие в способе разработки этих систем, реализация SQL происходила "снизу вверх". В первых выпущенных на рынок реализациях SQL в этих системах использовалось минимальное и очень ограниченное подмножество SQLSystemR. В частности, в первой известной автору реализации SQL в СУБД Oracle в операторах выборки не допускалось использование вложенных подзапросов.

Тем не менее, несмотря на эти ограничения и на очень слабую на первых порах эффективность, ориентация фирм на поддержание разных аппаратных платформ и заинтересованность пользователей в переходе к реляционным системам позволили фирмам добиться коммерческого успеха и приступить к совершенствованию своих реализаций. В текущих версиях Oracle и Informix поддерживаются достаточно мощные диалекты SQL, хотя реализация иногда вызывает сомнения.

Особенностью большинства современных коммерческих СУБД, затрудняющей анализ существующих диалектов SQL, является отсутствие полного описания языка. Обычно описание разбросано по разным руководствам и перемешано с описанием специфических для данной системы языковых средств, не имеющих отношения к SQL. Тем не менее можно сказать, что базовый набор операторов SQL, включающий операторы определения схемы БД, выборки и манипулирования данными, авторизации доступа к данным, поддержки встраивания SQL в языки программирования и операторы динамического SQL, в коммерческих реализациях относительно устоялся и более или менее соответствует стандарту.



Осуждаемые свойства языка SQL/


В стандарте SQL/92 присутствует приложение, устанавливающее "осуждаемые свойства" языка, т.е. свойства, которые оставлены в SQL/92 только для обеспечения совместимости с SQL/89 и которые, вероятно, будут удалены в какой-нибудь будущей версии стандарта. Эти свойства включают следующее:

Переменная SQLCODE (предпочтительнее SQLSTATE). Следовательно, например, целая переменная программы на языке Кобол, определенная как USAGEASCOMPUTATIONAL, также является осуждаемой, поскольку USAGE поддерживается только для SQLCODE. Беззнаковые целые как элементы упорядочивания в разделе ORDERBY (предпочтительнее использовать имена столбцов, введенные через раздел AS для соответствующих элементов выборки). Незаключенный в скобки список параметров в процедурах (предпочтительнее заключенные в скобки списки через запятую).



Подготавливаемый оператор позиционного удаления


<preparable dynamic delete statement: positioned> ::= DELETE [FROM <table name>] WHERE CURRENT OF <cursor name>

Пояснения:

Основной резон появления этого и следующего операторов состоит в том, что сочетание курсора, определенного на динамически подготовленном операторе выборки, и статически задаваемых операторов удаления и модификации по этому курсору, выглядит довольно нелепо. Поэтому в стандарте появились динамически подготавливаемые позиционные операторы удаления и вставки. Естественно, что выполняться они должны с помощью оператора EXECUTE.



Подготавливаемый оператор позиционной модификации


<preparable dynamic update statement: positioned> ::= UPDATE [<table name>] SET <set clause> [{<comma> <set clause>}...] WHERE CURRENT OF <cursor name>

Пояснения: см. предыдущий пункт.



Подключение к базе данных


Для подключения к серверу баз данных в SQL/92 предусмотрен оператор CONNECTTO. Следует заметить, что конструкции, предназначенные для управления подключениями и сессиями, относятся к наименее проработанным частям стандарта (хотя на практике они являются необходимыми, поскольку все современные серьезные СУБД выполнены в архитектуре "клиент-сервер"). Для управления подключением служат три оператора (CONNECT, SETCONNECTION и DISCONNECT), которые мы и рассмотрим в этом разделе.

3.8.1. Установление подключения

С выполнения этого оператора начинается сеанс взаимодействия с указанным сервером баз данных. Оператор описывается следующими синтаксическими правилами:

<connect statement> ::= CONNECT TO <connection target> <connection target> ::= <SQL-server name> [ AS <connection name> ] [ USER <user name> ] | DEFAULT

Пояснения:

Если в разделе цели соединения не указано имя пользователя, то по умолчанию используется неявное имя пользователя, определенное в реализации. Если оператор установления соединения выполняется после первого оператора, инициировавшего текущую транзакцию, и если в реализации не поддерживаются транзакции, взаимодействующие более чем с одним сервером, возбуждается исключительное условие. Имя соединения либо задается явно, либо выбирается по умолчанию, либо совпадает с обязательным параметром имени сервера; попытка установления соединения с именем, которое соответствует установленному и неразорваному соединению, вызывает возбуждение исключительной ситуации. Если имя соединения задается по умолчанию, то образуется SQL-сессия с именем по умолчанию, связанная с умалчиваемым SQL-сервером. Способ распознавания сервера по умолчанию определяется в реализации. Если оператор установления соединения успешно инициирует SQL-сессию, то

(a) текущее соединение и текущая транзакция становятся потенциальными; информация о контексте SQL-сервера сохраняется и не влияет на операции, выполняемые в инициированном соединении;

(b) образованные SQL-сессия и SQL-соединение становятся текущими.

Идентификатор авторизации SQL-сессии устанавливается в соответствии с указанным именем пользователя.



Подзапрос


Наконец, последняя конструкция SQL/89, которая может содержать табличные выражения, - это подзапрос, т.е. запрос, который может входить в предикат условия выборки оператора SQL. В SQL/89 к подзапросам применяется то ограничение, что результирующая таблица должна содержать в точности один столбец. Поэтому в синтаксических правилах, определяющих подзапрос, вместо списка выборки указано "выражение, вычисляющее значение", т.е. арифметическое выражение. Заметим еще, что поскольку подзапрос всегда вложен в некоторый другой оператор SQL, то в качестве констант в арифметическом выражении выборки и логических выражениях разделов WHERE и HAVING можно использовать значения столбцов текущих строк таблиц, участвующих в (под)запросах более внешнего уровня. Более подробно об этом см. ниже, при описании семантики табличных выражений.



Подзапросы


В стандарте SQL/92 специфицированы три вида подзапросов: скалярный, строчный и табличный. Скалярный подзапрос выдает одно значение некоторого типа; строчный подзапрос выдает одну строку; табличный подзапрос выдает таблицу. В основе каждого вида подзапроса лежит табличное выражение. Синтаксически соответствующие конструкции определяются следующими правилами:

<scalar subquery> ::= <subquery> <row subquery> ::= <subquery> <table subquery> ::= <subquery> <subquery> ::= <left paren> <query expression> <right paren>

Пояснения:

Степень скалярного подзапроса должна быть равна 1. Степень строчного подзапроса должна быть больше 1. Тип данных скалярного подзапроса совпадает с типом данных соответствующего столбца выражения запросов. Типы данных столбцов строчного или табличного подзапроса совпадают с типами данных соответствующих столбцов выражения запросов. Если мощность скалярного или строчного подзапроса больше 1, то возбуждается исключительное условие.

Теперь мы в состоянии привести синтаксические определения и соответствующие пояснения по поводу выражения запросов:

<query expression> ::= <non-join query expression> |<joined table> <non-join query expression> ::= <non-join query term> |<query expression> UNION [ ALL ] [ <corresponding spec> ] |<query term> <query expression> EXCEPT [ ALL ] [ <corresponding spec> ] <query term> <query term> ::= <non-join query term> |<joined table> <non-join query term> ::= <non-join query primary> |<query term> INTERSECT [ ALL ] [ <corresponding spec> ] <query primary> <query primary> ::= <non-join query primary> |<joined table> <non-join query primary> ::= <simple table> |<left paren> <non-join query expression> <right paren> <simple table> ::= <query specification> |<table value constructor> |<explicit table> <explicit table> ::= TABLE <table name> <corresponding spec> ::= CORRESPONDING [ BY <left paren> <corresponding column list> <right paren> ] <corresponding column list> ::= <column name list>


Пояснения:

Если в терме или выражении запросов без соединения присутствует теоретико-множественный оператор, то пусть T1, T2 и TR обозначают соответственно первый операнд, второй операнд и результат терма или выражения, а OP - используемую теоретико-множественную операцию. Если специфицировано CORRESPONDING, то

(a) одно имя столбца не должно быть специфицировано более одного раза для столбцов T1 и T2;

(b) по крайней мере один столбец T1 должен иметь имя, являющееся именем некоторого столбца T2;

(c) если список соответствия столбцов не задан, пусть SL обозначает список выборки с указанием имен столбцов, являющихся именами столбцов и в T1, и в T2, в том порядке, в котором эти имена фигурируют в T1;

(d) если список соответствия столбцов задан, то пусть SL обозначает список выборки с указанием тех имен столбцов, явно входящих в список соответствия, в том порядке, в котором эти имена фигурируют в списке соответствия; каждое имя столбца в списке соответствия должно быть именем столбца и T1, и T2;

(e) терм или выражение запросов без соединения эквивалентны следующему:

(SELECTSLFROMTN1) OP (SELECTSLFROMTN2).



Если CORRESPONDING не указано, то T1 и T2 должны быть одинаковой степени. Если не задан теоретико-множественный оператор, то результатом вычисления выражения запросов является результат вычисления простой или соединенной таблицы. Если теоретико-множественный оператор задан, то результатом его применения является таблица, содержащая следующие строки:

(a) пусть R - строка, являющаяся дубликатом некоторой строки T1 или некоторой строки T2 или обоих; пусть m - число дубликатов R в T1, а n - число дубликатов R в T2;

(b) если специфицировано ALL, то

(i) если указана операция UNION, то число дубликатов R в T равно m + n;

(ii) если указана операция EXCEPT, то число дубликатов R в T равно max ((m-n),0);

(iii) если указана операция INTERSECT, то число дубликатов R в T равно min (m,n).




Предикат between


Предикат between имеет следующий синтаксис:

<between predicate> ::= <value expression> [NOT] BETWEEN <value expression> AND <value expression>

Результат "x BETWEEN y AND z" тот же самый, что результат "x >= y AND x <= z". Результат "x NOT BETWEEN y AND z" тот же самый, что результат "NOT (x BETWEEN y AND z)".


Как и в SQL/89, предикат позволяет специфицировать условие вхождения в диапазон значений, но в SQL/92 операндами являются строки:

<between predicate> ::= <row value constructor> [ NOT ] BETWEEN <row value constructor> AND <row value constructor>

Пояснения:

Все три строки-операнды должны иметь одну и ту же степень. Типы данных соответствующих значений строк-операндов должны быть совместимыми. Пусть X, Y и Z обозначают первый, второй и третий операнды. "XNOTBETWEENYANDZ" эквивалентно "NOT (XBETWEENYANDZ)". "XBETWEENYANDZ" эквивалентно "X>=YANDX<=Z".



Предикат exists


Предикат exists имеет следующий синтаксис:

<exists predicate> ::= EXISTS <subquery>

Значением этого предиката всегда является true или false, и это значение равно true тогда и только тогда, когда результат вычисления подзапроса не пуст.


Этот предикат имеет тот же смысл, что и соответствующий предикат языка SQL/89, но теперь его операндом может быть табличный подзапрос:

<exists predicate> ::= EXISTS <table subquery>

Пояснение: Если мощность табличного подзапроса больше нуля, то значение соответствующего условия есть true; иначе - false.



Предикат in


Предикат in определяется следующими синтаксическими правилами:

<in predicate> ::= <value expression> [NOT] IN {<subquery> (<in value list>)} <in value list> ::= <value specification> {,<value specification>}...

Типы левого операнда и значений из списка правого операнда (напомним, что результирующая таблица подзапроса должна содержать ровно один столбец) должны быть сравнимыми.

Значение предиката равно true в том и только в том случае, когда значение левого операнда совпадает хотя бы с одним значением списка правого операнда. Если список правого операнда пуст (так может быть, если правый операнд задается подзапросом), или значение "подразумеваемого" предиката сравнения x = y (где x - значение арифметического выражения левого операнда) равно false для каждого элемента y списка правого операнда, то значение предиката in равно false. В противном случае значение предиката in равно unknown. По определению значение предиката "x NOT IN S" равно значению предиката "NOT (x IN S)".


Предикат позволяет специфицировать условие вхождения строчного значения в указанное множество значений. Синтаксические правила следующие:

<in predicate> ::= <row value constructor> [ NOT ] IN <in predicate value> <in predicate value> ::= <table subquery> |<left paren> <in value list> <right paren> <in value list> ::= <value expression> { <comma> <value expression> }...

Пояснения:

Пусть IVL обозначает список включаемых значений (<invaluelist>). Тогда (IVL) эквивалентно конструктору табличного значения (VALUESIVL). Пусть RVC обозначает строку-первый операнд, а IPV - множество значений (<inpredicatevalue>. Выражение RVCNOTINIPV эквивалентно NOT (RVCINIPV). Выражение RVCINIPV эквивалентно RVC = ANYIPV.



Предикат like


Предикат like имеет следующий синтаксис:

<like predicate> ::= <column specification> [NOT] LIKE <pattern> [ESCAPE <escape character>] <pattern> ::= <value specification> <escape character> ::= <value specification>

Типы данных столбца левого операнда и образца должны быть типами символьных строк. В разделе ESCAPE должен специфицироваться одиночный символ.

Значение предиката равно true, если pattern является подстрокой заданного столбца. При этом, если раздел ESCAPE отсутствует, то при сопоставлении шаблона со строкой производится специальная интерпретация двух символов шаблона: символ подчеркивания ("_") обозначает любой одиночный символ; символ процента ("%") обозначает последовательность произвольных символов произвольной длины (может быть, нулевой).

Если же раздел ESCAPE присутствует и специфицирует некоторый одиночный символ x, то пары символов "x_" и "x%" представляют одиночные символы "_" и "%" соответственно.

Значение предиката like есть unknown, если значение столбца либо шаблона неопределено.

Значение предиката "x NOT LIKE y ESCAPE z" совпадает со значением "NOT x LIKE y ESCAPE z".


Формально предикат определяется следующими синтаксическими правилами:

<like predicate> ::= <match value> [ NOT ] LIKE <pattern> [ ESCAPE <escape character> ] <match value> ::= <character value expression> <pattern> ::= <character value expression> <escape character> ::= <character value expression>

Пояснения: Если не считать того, что в соответствующем условии можно использовать выражения, вырабатывающие значения типа символьных строк, и того, что для используемого набора символов может быть явно задан порядок сортировки, смысл предиката LIKE в SQL/92 не изменился по сравнению с SQL/89.



Предикат match


Предикат позволяет сформулировать условие соответствия строчного значения результату табличного подзапроса. Синтаксис определяется следующим правилом:

<match predicate> ::= <row value constructor> MATCH [ UNIQUE ] [ PARTIAL FULL ] <table subquery>

Пояснения:

Степень первого операнда должна совпадать со степенью табличного подзапроса. Типы данных первого операнда должны быть совместимы с типами соответствующих столбцов табличного подзапроса. Сравнение пар соответствующих значений производится аналогично тому, как это специфицировалось для предиката сравнения. Пусть R обозначает строку-первый операнд. Если не указано ни PARTIAL, ни FULL, то

(a) если некоторое значение в R является неопределенным, то значением условия является true;

(b) если в R нет неопределенных значений, то

(i) если не указано UNIQUE и существует (возможно, не уникальная) строка RTi в результате табличного подзапроса такая, что R = RTi, то значение условия есть true;

(ii) если указано UNIQUE и в результате табличного подзапроса существует уникальная строка RTi такая, что R = RTi, то значение условия есть true;

(iii) в противном случае значением условия является false.

Если указано PARTIAL, то

(a) если все значения в R неопределенные, то значение условия есть true;

(b) иначе:

(i) если не указано UNIQUE и в результате табличного подзапроса существует (возможно, не уникальная) строка RTi такая, что каждое отличное от неопределенного значение R равно соответствующему значению RTi, то значение условия есть true;

(ii) если указано UNIQUE и в табличном подзапросе существует уникальная строка RTi такая, что каждое отличное от неопределенного значение R равно соответствующему значению RTi, то значение условия есть true;

(iii) в противном случае значение условия есть false.

Если указано FULL, то

(a) если все значения в R неопределенные, то значение условия есть true.

(b) если в R нет неопределенных значений, то

(i) если не указано UNIQUE и в результате табличного подзапроса существует (возможно, не уникальная) строка RTi такая, что R = RTi, то значение условия есть true;

(ii) если указано UNIQUE и в результате табличного подзапроса существует уникальная строка RTi такая, что R = RTi, то значение условия есть true;

(iii) в противном случае значение условия есть false;

(c) в противном случае значение условия есть false.



Предикат null


Предикат null описывается синтаксическим правилом:

<null predicate> ::= <column specification> IS [NOT] NULL

Этот предикат всегда принимает значения true или false. При этом значение "x IS NULL" равно true тогда и только тогда, когда значение x неопределено. Значение предиката "x NOT IS NULL" равно значению "NOT x IS NULL".


Как и в SQL/89, предикат null позволяет проверить, не является ли значение неопределенным, но теперь в нем можно использовать операнд-строку:

<null predicate> ::= <row value constructor> IS [ NOT ] NULL

Пояснения:

Пусть R обозначает значение строки-операнда. Если все значения, входящие в R, являются неопределенными, значение условия "RISNULL" есть true; иначе - false. Если ни одно из значений R не является неопределенным, то значением условия "RISNOTNULL" является true; иначе - false.

Замечание: для всех R условие "RISNOTNULL" имеет то же значение, что условие "NOTRISNULL" в том и только в том случае, когда степень R равна 1. Полная семантика предиката null приведена в следующей таблице:

УсловиеRISNULLRISNOTNULLNOTRISNULLNOTRISNOTNULL
Степень 1: nulltruefalsefalsetrue
Степень 1: notnullfalsetruetruefalse
Степень > 1: все nulltruefalsefalsetrue
degree > 1: есть nullfalsefalsetruetrue
degree > 1: нет nullfalsetruetruefalse



Предикат overlaps


Этот предикат служит для проверки перекрытия во времени двух событий. Условие определяется следующим синтаксисом:

<overlaps predicate> ::= <row value constructor 1> OVERLAPS <row value constructor 2> <row value constructor 1> ::= <row value constructor> <row value constructor 2> ::= <row value constructor>

Пояснения:

Степень каждой из строк-операндов должна быть равна 2. Тип данных первого столбца каждого из операндов должен быть типом даты-времени, и типы данных первых столбцов должны быть совместимы. Тип данных второго столбца каждого из операндов должен быть типом даты-времени или интервала.

(a) если это тип интервала, то точность типа должна быть такой, чтобы интервал можно было прибавить к значению типа дата-время первого столбца;

(b) если это тип дата-время, то он должен быть совместим с типом данных дата-время первого столбца.

Пусть D1 и D2 обозначают значения первого столбца первого и второго операндов соответственно. Если второй столбец первого операнда имеет тип дата-время, то пусть E1 обозначает его значение. Если второй столбец первого операнда имеет тип INTERVAL, то пусть I1 обозначает его значение, а E1 = D1 + I1. Если D1 - неопределенное значение или если E1 < D1, то пусть S1 = E1 и T1 = D1. Иначе, пусть S1 = D1 и T1 = E1. Аналогично определяются S2 и T2 применительно ко второму операнду. Результат условия совпадает с результатом вычисления следующего выражения:

(S1 > S2 ANDNOT (S1 >= T2 ANDT1 >= T2)) OR (S2 > S1 ANDNOT (S2 >= T1 ANDT2 >= T1)) OR (S1 = S2 AND (T1 <> T2 ORT1 = T2))



Предикат с квантором


Предикат с квантором имеет следующий синтаксис:

<quantified predicate> ::= <value expression> <comp op> <quantifier> <subquery> <quantifier> ::= <all> <some> <all> ::= ALL <some> ::= SOME ANY

Обозначим через x результат вычисления арифметического выражения левой части предиката, а через S результат вычисления подзапроса.

Предикат "x <comp op> ALL S" имеет значение true, если S пусто или значение предиката "x<comp op> s" равно true для каждого s, входящего в S. Предикат "x <comp op> ALL S" имеет значение false, если значение предиката "x <comp op> s" равно false хотя бы для одного s, входящего в S. В остальных случаях значение предиката "x <comp op> ALL S" равно unknown.

Предикат "x <comp op> SOME S" имеет значение false, если S пусто или значение предиката "x <comp op> s" равно false для каждого s, входящего в S. Предикат "x <comp op> SOME S" имеет значение true, если значение предиката "x <comp op> s" равно true хотя бы для одного s, входящего в S. В остальных случаях значение предиката "x <comp op> SOME S" равно unknown.



Предикат сравнения


Синтаксис предиката сравнения определяется следующими правилами:

<comparison predicate> ::= <value expression> <comp op> {<value expression> <subquery>} <comp op> ::= = <> < > <= >=

Через "<>" обозначается операция "неравенства". Арифметические выражения левой и правой частей предиката сравнения строятся по общим правилам построения арифметических выражений и могут включать в общем случае имена столбцов таблиц из раздела FROM и константы. Типы данных арифметических выражений должны быть сравнимыми (например, если тип столбца a таблицы A является типом символьных строк, то предикат "a = 5" недопустим).

Если правый операнд операции сравнения задается подзапросом, то дополнительным ограничением является то, что мощность результата подзапроса должна быть не более единицы. Если хотя бы один из операндов операции сравнения имеет неопределенное значение, или если правый операнд является подзапросом с пустым результатом, то значение предиката сравнения равно unknown.

Заметим, что значение арифметического выражения не определено, если в его вычислении участвует хотя бы одно неопределенное значение. Еще одно важное замечание из стандарта SQL/89: в контексте GROUPBY, DISTINCT и ORDERBY неопределенное значение выступает как специальный вид определенного значения, т.е. возможно, например, образование группы строк, значение указанного столбца которых является неопределенным. Для обеспечения переносимости прикладных программ нужно внимательно оценивать специфику работы с неопределенными значениями в конкретной СУБД.



Предикат сравнения с квантором


Этот предикат позволяет специфицировать квантифицированное сравнение строчного значения и определяется следующими синтаксическими правилами:

<quantified comparison predicate> ::= <row value constructor> <comp op> <quantifier> <table subquery> <quantifier> ::= <all> <some> <all> ::= ALL <some> ::= SOME ANY

Пояснения:

Степень первого операнда должна быть такой же, как и степень табличного подзапроса. Типы данных значений строки-операнда должны быть совместимы с типами данных соответствующих столбцов табличного подзапроса. Сравнение строк производится по тем же правилам, что и для предиката сравнения (п. 3.4.1). В остальном вычисление условий с кванторами some и all производится так же, как для предиката с квантором в языке SQL/89.



Предикат unique


Этот предикат позволяет сформулировать условие отсутствия дубликатов в результате запроса:

<unique predicate> ::= UNIQUE <table subquery>

Пояснение: результат вычисления условия UNIQUE <tablesubquery> есть true, если в таблице-результате вычисления табличного подзапроса нет таких двух строк, что значение каждого столбца одной строки не является неопределенным и равным значению соответствующего столбца второй строки; в противном случае значение условия есть false.



В этом курсе будут рассмотрены


В этом курсе будут рассмотрены основные возможности стандартного языка доступа к базам данных SQL. Почему эта тема кажется такой важной? Ответ очевиден. Как и в случае использования любого стандартизованного средства, нужно понимать, что обязательно должны делать поставщики, а какие предлагаемые ими средства являются дополнительными. Если вы не хотите попасть в плен к некоторому конкретному производителю, нужно пользоваться только стандартными средствами. Особенно важно то, что язык баз данных SQL является повсеместно распространенным. Невозможно найти компанию, производящую развитые средства управления базами данных, основной интерфейс доступа к базам данных которой основывался бы на другом языке. Невозможно создать информационную систему, в которой не использовался бы язык SQL. Если имеется желание сделать эту информационную систему более или менее не зависящей от первоначального поставщика аппаратуры и/или базового программного обеспечения, необходимо пользоваться согласованным набором стандартов, в состав которых обязательно будет входить стандарт языка SQL.
Курс организован следующим образом. В первой главе приводится введение, в котором обсуждаются история языка SQL, начиная с экспериментального проекта компании IBMSystemR, этапы стандартизации языка, особенности текущих реализаций, проблемы применения стандартов языка при разработке прикладных информационных систем.
Вторая глава посвящена первому международному стандарту языков баз данных - SQL/89. Описывается общая структура стандарта и его основные составляющие. Далее обсуждаются используемые в SQL/89 типы данных. Следующий набор тем относится к средствам формулирования запросов, включая особенности так называемого "встроенного SQL". После этого речь идет о возможностях определения схемы базы данных, включая средства определения таблиц, столбцов, ограничений целостности, представлений, привилегий доступа. Рассматриваются два базовых способа использования языка SQL при разработке прикладных программ - встроенный SQL и язык модулей. Наконец, в завершение главы излагаются основные принципы формулировки операторов манипулирования данными ("вставить новую строку в таблицу", "удалить существующую строку", "изменить содержимое существующей строки").
В третьей главе описываются основные свойства SQL/92. Глава начинается с введения в основные понятия SQL/92: типы данных, домены, ограничения целостности, каталоги базы данных, привилегии, транзакции, сессии и т.д. Вслед за этим обсуждаются возможные виды скалярных выражений: арифметические выражения, выражения над строками, выражения с датами и временем, выражения с переключателем. Далее рассматриваются способы построения запросов, которые в стандарте SQL/92 допускают гораздо больше способов формулировки, чем в SQL/89. В отдельном разделе обсуждаются допустимые условия выборки. В SQL/92 по сравнению с SQL/89 имеется существенно более развитый набор средств определения и манипулирования схемой базы данных. Рассмотрению этих средств посвящен очередной раздел. В следующем разделе главы описываются средства манипулирования данными в соответствии со стандартом SQL/92: операторы, связанные с курсором, одиночные операторы, возможности работы со временными таблицами. Далее обсуждаются способы управления транзакциями, сессиями и подключениями к базам данных. После этого говорится о встроенном, динамическом и интерактивном подъязыках SQL. В заключение главы рассказывается о трех уровнях языка SQL, определенных в стандарте (это важная часть курса, поскольку на сегодня нет ни одной полной реализации языка).
В четвертой главе курса приводится обсуждение сравнительных характеристик языков SQL/89 и SQL/92, а также проблемы частичной несовместимости этих языков. В заключение курса рассматриваются некоторые свойства, которые ожидается увидеть в следующем стандарте - SQL/3.
|

Представление ASSERTIONS


Представление идентифицирует утверждения целостности, определенные в данном каталоге и принадлежащие данному пользователю. Определение представления:

CREATE VIEW ASSERTIONS AS SELECT CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA, CONSTRAINT_NAME, IS_DEFERRABLE, INITIALLY_DEFERRED FROM DEFINITION_SCHEMA.ASSERTIONS JOIN DEFINITION_SCHEMA.SCHEMATA S ON ((CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA) = (S.CATALOG_NAME, S.SCHEMA_NAME)) WHERE SCHEMA_OWNER = CURRENT_USER AND CONSTRAINT_CATALOG = (SELECT CATALOG_NAME FROM INFORMATION_SCHEMA_CATALOG_NAME)



Представление CHARACTER_SETS


Это представление идентифицирует наборы символов, определенные в данном каталоге и доступные данному пользователю:

CREATE VIEW CHARACTER_SETS AS SELECT CHARACTER_SET_CATALOG, CHARACTER_SET_SCHEMA, CHARACTER_SET_NAME, FORM_OF_USE, NUMBER_OF_CHARACTERS, DEFAULT_COLLATE_CATALOG, DEFAULT_COLLATE_SCHEMA, DEFAULT_COLLATE_NAME FROM DEFINITION_SCHEMA.CHARACTER_SETS WHERE (CHARACTER_SET_CATALOG, CHARACTER_SET_SCHEMA, CHARACTER_SET_NAME, 'CHARACTER SET') IN (SELECT OBJECT_CATALOG, OBJECT_SCHEMA, OBJECT_NAME, OBJECT_TYPE FROM DEFINITION_SCHEMA.USAGE_PRIVILEGES WHERE GRANTEE IN ('PUBLIC', CURRENT_USER)) AND CHARACTER_SET_CATALOG = (SELECT CATALOG_NAME FROM INFORMATION_SCHEMA_CATALOG_NAME)

Далее мы пропустим определения двух представлений - COLLATIONS и TRANSLATIONS, поскольку соответствующие понятия не рассматривались в курсе и смысл этих представлений все равно будет непонятен (как мы отмечали, вообще понятия, связанные с использованием национальных наборов символов, трудно использовать обычным пользователям).



Представление CHECK_CONSTRAINTS


Представление идентифицирует проверочные ограничения, определенные в данном каталоге и принадлежащие данному пользователю. Определение представления:

CREATE VIEW CHECK_CONSTRAINTS AS SELECT CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA, CONSTRAINT_NAME, CHECK_CLAUSE FROM DEFINITION_SCHEMA.CHECK_CONSTRAINTS JOIN DEFINITION_SCHEMA.SCHEMATA S ON ((CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA) = (S.CATALOG_NAME, S.SCHEMA_NAME)) WHERE SCHEMA_OWNER = CURRENT_USER AND CONSTRAINT_CATALOG = (SELECT CATALOG_NAME FROM INFORMATION_SCHEMA_CATALOG_NAME)



Представление COLUMN_DOMAIN_USAGE


Представление идентифицирует столбцы, определенные в данном каталоге, которые зависят от домена, определенного в этом же каталоге, и принадлежат данному пользователю. Определение представления выглядит следующим образом:

CREATE VIEW COLUMN_DOMAIN_USAGE AS SELECT D.DOMAIN_CATALOG, D.DOMAIN_SCHEMA, D.DOMAIN_NAME, TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME FROM DEFINITION_SCHEMA.COLUMNS C JOIN DEFINITION_SCHEMA.DOMAINS D JOIN DEFINITION_SCHEMA.SCHEMATA S ON ((DOMAIN_CATALOG, DOMAIN_SCHEMA) = (S.CATALOG_NAME, S.SCHEMA_NAME)) ON ((D.DOMAIN_CATALOG, D.DOMAIN_SCHEMA, D.DOMAIN_NAME) = (C.DOMAIN_CATALOG, C.DOMAIN_SCHEMA, C.DOMAIN_NAME)) WHERE SCHEMA_OWNER = CURRENT_USER AND C.DOMAIN_NAME IS NOT NULL AND D.DOMAIN_CATALOG = (SELECT CATALOG_NAME FROM INFORMATION_SCHEMA_CATALOG_NAME)



Представление COLUMN_PRIVILEGES


Это представление идентифицирует привилегии для столбцов таблиц, определенных в данном каталоге, которые доступны данному пользователю или переданы им. Представление определяется следующим образом:

CREATE VIEW COLUMN_PRIVILEGES AS SELECT GRANTOR, GRANTEE, TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, PRIVILEGE_TYPE, IS_GRANTABLE FROM DEFINITION_SCHEMA.COLUMN_PRIVILEGES WHERE GRANTEE IN ('PUBLIC', CURRENT_USER) OR GRANTOR = CURRENT_USER AND TABLE_CATALOG = (SELECT CATALOG_NAME FROM INFORMATION_SCHEMA_CATALOG_NAME)



Представление COLUMNS


Представление идентифицирует столбцы таблиц, определенных в данном каталоге и доступных данному пользователю. Представление определяется следующим образом:

CREATE VIEW COLUMNS AS SELECT DISTINCT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, C.COLUMN_NAME, ORDINAL_POSITION, CASE WHEN EXISTS (SELECT * FROM DEFINITION_SCHEMA.SCHEMATA AS S WHERE (TABLE_CATALOG, TABLE_SCHEMA) = (S.CATALOG_NAME, S.SCHEMA_NAME) AND SCHEMA_OWNER = USER) THEN COLUMN_DEFAULT ELSE NULL END AS COLUMN_DEFAULT, IS_NULLABLE, COALESCE (D1.DATA_TYPE, D2.DATA_TYPE) AS DATA_TYPE, LESCE (D1.CHARACTER_MAXIMUM_LENGTH, D2.CHARACTER_MAXIMUM_LENGTH) AS CHARACTER_MAXIMUM_LENGTH, COALESCE (D1.CHARACTER_OCTET_LENGTH, D2.CHARACTER_OCTET_LENGTH) AS CHARACTER_OCTET_LENGTH, COALESCE (D1.NUMERIC_PRECISION, D2.NUMERIC_PRECISION) AS NUMERIC_PRECISION, COALESCE (D1.NUMERIC_PRECISION_RADIX, D2.NUMERIC_PRECISION_RADIX) AS NUMERIC_PRECISION_RADIX, COALESCE (D1.NUMERIC_SCALE, D2.NUMERIC_SCALE) AS NUMERIC_SCALE, COALESCE (D1.DATETIME_PRECISION, D2.DATETIME_PRECISION) AS DATETIME_PRECISION, COALESCE (C1.CHARACTER_SET_CATALOG, C2.CHARACTER_SET_CATALOG) AS CHARACTER_SET_CATALOG, COALESCE (C1.CHARACTER_SET_SCHEMA, C2.CHARACTER_SET_SCHEMA) AS CHARACTER_SET_SCHEMA, COALESCE (C1.CHARACTER_SET_NAME, C2.CHARACTER_SET_NAME) AS CHARACTER_SET_NAME, COALESCE (D1.COLLATION_CATALOG, D2.COLLATION_CATALOG) AS COLLATION_CATALOG, COALESCE (D1.COLLATION_SCHEMA, D2.COLLATION_SCHEMA) AS COLLATION_SCHEMA, COALESCE (D1.COLLATION_NAME, D2.COLLATION_NAME) AS COLLATION_NAME, DOMAIN_CATALOG, DOMAIN_SCHEMA, DOMAIN_NAME FROM DEFINITION_SCHEMA.COLUMNS AS C LEFT JOIN DEFINITION_SCHEMA.DATA_TYPE_DESCRIPTOR AS D1 LEFT JOIN DEFINITION_SCHEMA.COLLATIONS AS C1 ON ((C1.COLLATION_CATALOG, C1.COLLATION_SCHEMA, C1.COLLATION_NAME) = (D1.COLLATION_CATALOG, D1.COLLATION_SCHEMA, D1.COLLATION_NAME)) ON ((C.TABLE_CATALOG, C.TABLE_SCHEMA, C.TABLE_NAME, C.COLUMN_NAME) = (D1.TABLE_OR_DOMAIN_CATALOG, D1.TABLE_OR_DOMAIN_SCHEMA, D1.TABLE_OR_DOMAIN_NAME, D1.COLUMN_NAME)) LEFT JOIN DEFINITION_SCHEMA.DATA_TYPE_DESCRIPTOR AS D2 LEFT JOIN DEFINITION_SCHEMA.COLLATIONS AS C2 ON ((C2.COLLATION_CATALOG, C2.COLLATION_SCHEMA, C2.COLLATION_NAME) = (D2.COLLATION_CATALOG, D2.COLLATION_SCHEMA, D2.COLLATION_NAME)) ON ((C.DOMAIN_CATALOG, C.DOMAIN_SCHEMA, C.DOMAIN_NAME) = (D2.TABLE_OR_DOMAIN_CATALOG, D2.TABLE_OR_DOMAIN_SCHEMA, D2.TABLE_OR_DOMAIN_NAME)) WHERE (C.TABLE_CATALOG, C.TABLE_SCHEMA, C.TABLE_NAME, C.COLUMN_NAME) IN (SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME FROM DEFINITION_SCHEMA.COLUMN_PRIVILEGES WHERE GRANTEE IN ('PUBLIC', CURRENT_USER)) AND C.TABLE_CATALOG = (SELECT CATALOG_NAME FROM INFORMATION_SCHEMA_CATALOG_NAME)



Представление CONSTRAINT_COLUMN_USAGE


Представление идентифицирует столбцы, используемые в ссылочных ограничениях, ограничениях уникальности, проверочных ограничениях и утверждениях целостности, которые определены в данном каталоге и принадлежат данному пользователю. Определение представления:

CREATE VIEW CONSTRAINT_COLUMN_USAGE AS SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA, CONSTRAINT_NAME FROM ((SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA, CONSTRAINT_NAME FROM DEFINITION_SCHEMA.CHECK_COLUMN_USAGE) UNION (SELECT K.TABLE_CATALOG, K.TABLE_SCHEMA, K.TABLE_NAME, K.COLUMN_NAME, CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA, CONSTRAINT_NAME FROM DEFINITION_SCHEMA.TABLE_CONSTRAINTS JOIN DEFINITION_SCHEMA.KEY_COLUMN_USAGE AS K USING (CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA, CONSTRAINT_NAME)) JOIN DEFINITION_SCHEMA.SCHEMATA ON ((TABLE_CATALOG, TABLE_SCHEMA) = (CATALOG_NAME, SCHEMA_NAME)) WHERE SCHEMA_OWNER = CURRENT_USER AND CONSTRAINT_CATALOG = (SELECT CATALOG_NAME FROM INFORMATION_SCHEMA_CATALOG_NAME)



Представление CONSTRAINT_TABLE_USAGE


Это представление идентифицирует таблицы, используемые в ссылочных ограничениях, ограничениях уникальности, проверочных ограничениях и утверждениях целостности, которые определены в данном каталоге и принадлежат данному пользователю. Определение представления: CREATE VIEW CONSTRAINT_TABLE_USAGE AS SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA, CONSTRAINT_NAME FROM ((SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA, CONSTRAINT_NAME FROM DEFINITION_SCHEMA.CHECK_COLUMN_USAGE) UNION (SELECT PK.TABLE_CATALOG, PK.TABLE_SCHEMA, PK.TABLE_NAME, FK.CONSTRAINT_CATALOG, FK.CONSTRAINT_SCHEMA, FK.CONSTRAINT_NAME FROM DEFINITION_SCHEMA.REFERENTIAL_CONSTRAINTS AS FK JOIN DEFINITION_SCHEMA.TABLE_CONSTRAINTS AS PK ON (FK.UNIQUE_CONSTRAINT_CATALOG, FK.UNIQUE_CONSTRAINT_SCHEMA, FK.UNIQUE_CONSTRAINT_NAME) = (PK.CONSTRAINT_CATALOG, PK.CONSTRAINT_SCHEMA, PK.CONSTRAINT_NAME))) JOIN DEFINITION_SCHEMA.SCHEMATA S ON ((TABLE_CATALOG, TABLE_SCHEMA) = (S.CATALOG_NAME, S.SCHEMA_NAME)) WHERE S.SCHEMA_OWNER = CURRENT_USER AND CONSTRAINT_CATALOG = (SELECT CATALOG_NAME FROM INFORMATION_SCHEMA_CATALOG_NAME)



Представление DOMAIN_CONSTRAINTS


Это представление идентифицирует ограничения доменов в данном каталоге, доступных данному пользователю. Определение представления:

CREATE VIEW DOMAIN_CONSTRAINTS AS SELECT DISTINCT CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA, CONSTRAINT_NAME, DOMAIN_CATALOG, DOMAIN_SCHEMA, DOMAIN_NAME, IS_DEFERRABLE, INITIALLY_DEFERRED FROM DEFINITION_SCHEMA.DOMAIN_CONSTRAINTS JOIN DEFINITION_SCHEMA.SCHEMATA AS S ON ((CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA) = (S.CATALOG_NAME, SCHEMA_NAME S)) WHERE SCHEMA_OWNER = CURRENT_USER AND CONSTRAINT_CATALOG = (SELECT CATALOG_NAME FROM INFORMATION_SCHEMA_CATALOG_NAME)



Представление DOMAINS


Представление идентифицирует домены в данном каталоге, доступные данному пользователю. Представление определяется следующим образом:

CREATE VIEW DOMAINS AS SELECT DISTINCT DOMAIN_CATALOG, DOMAIN_SCHEMA, DOMAIN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, CHARACTER_OCTET_LENGTH, COLLATION_CATALOG, COLLATION_SCHEMA,COLLATION_NAME, CHARACTER_SET_CATALOG, CHARACTER_SET_SCHEMA, CHARACTER_SET_NAME, NUMERIC_PRECISION, NUMERIC_PRECISION_RADIX, NUMERIC_SCALE, DATETIME_PRECISION, DOMAIN_DEFAULT FROM DEFINITION_SCHEMA.DOMAINS JOIN DEFINITION_SCHEMA.DATA_TYPE_DESCRIPTOR AS D LEFT JOIN DEFINITION_SCHEMA.COLLATIONS AS S USING (COLLATION_CATALOG, COLLATION_SCHEMA, COLLATION_NAME) ON ((DOMAIN_CATALOG, DOMAIN_SCHEMA, DOMAIN_NAME, '') = (TABLE_OR_DOMAIN_CATALOG, TABLE_OR_DOMAIN_SCHEMA, TABLE_OR_DOMAIN_NAME, COLUMN_NAME)) WHERE ((DOMAIN_CATALOG, DOMAIN_SCHEMA, DOMAIN_NAME, 'DOMAIN') IN (SELECT OBJECT_CATALOG, OBJECT_SCHEMA, OBJECT_NAME, OBJECT_TYPE FROM DEFINITION_SCHEMA.USAGE_PRIVILEGES WHERE GRANTEE IN ('PUBLIC', CURRENT_USER)) OR (DOMAIN_CATALOG, DOMAIN_SCHEMA, DOMAIN_NAME) IN (SELECT DOMAIN_CATALOG, DOMAIN_SCHEMA, DOMAIN_NAME FROM COLUMNS)) AND DOMAIN_CATALOG = (SELECT CATALOG_NAME FROM INFORMATION_SCHEMA_CATALOG_NAME)



Представление KEY_COLUMN_USAGE


Это представление идентифицирует столбцы, определенные в данном каталоге и объявленные ключевыми данным пользователем. Представление определяется следующим образом:

CREATE VIEW KEY_COLUMN_USAGE AS SELECT CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA, CONSTRAINT_NAME, TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, ORDINAL_POSITION FROM DEFINITION_SCHEMA.KEY_COLUMN_USAGE JOIN DEFINITION_SCHEMA.SCHEMATA S ON ((CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA) = (S.CATALOG_NAME, S.SCHEMA_NAME)) WHERE SCHEMA_OWNER = CURRENT_USER AND CONSTRAINT_CATALOG = (SELECT CATALOG_NAME FROM INFORMATION_SCHEMA_CATALOG_NAME)



Представление REFERENTIAL_CONSTRAINTS


Это представление идентифицирует ссылочные ограничения, определенные в данном каталоге и принадлежащие данному пользователю. Определение представления:

CREATE VIEW REFERENTIAL_CONSTRAINTS AS SELECT CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA, CONSTRAINT_NAME, UNIQUE_CONSTRAINT_CATALOG, UNIQUE_CONSTRAINT_SCHEMA, UNIQUE_CONSTRAINT_NAME, MATCH_OPTION, UPDATE_RULE, DELETE_RULE FROM DEFINITION_SCHEMA.REFERENTIAL_CONSTRAINTS JOIN DEFINITION_SCHEMA.SCHEMATA S ON ((CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA) = (S.CATALOG_NAME, S.SCHEMA_NAME)) WHERE SCHEMA_OWNER = CURRENT_USER AND CONSTRAINT_CATALOG = (SELECT CATALOG_NAME FROM INFORMATION_SCHEMA_CATALOG_NAME)



Представление SCHEMATAview


Это представление идентифицирует схемы, принадлежащие данному пользователю. Определение представления:

CREATE VIEW SCHEMATA AS SELECT CATALOG_NAME, SCHEMA_NAME, SCHEMA_OWNER, DEFAULT_CHARACTER_SET_CATALOG, DEFAULT_CHARACTER_SET_SCHEMA, DEFAULT_CHARACTER_SET_NAME FROM DEFINITION_SCHEMA.SCHEMATA WHERE SCHEMA_OWNER = CURRENT_USER AND CATALOG_NAME = ( SELECT CATALOG_NAME FROM INFORMATION_SCHEMA_CATALOG_NAME)



Представление SQL_LANGUAGES


Это представление идентифицирует уровни соответствия, опции и диалекты, поддерживаемые реализацией SQL, обрабатывающей данные, которые определены в данном каталоге. Представление определяется следующим образом:

CREATE VIEW SQL_LANGUAGES AS SELECT SQL_LANGUAGE_SOURCE, SQL_LANGUAGE_YEAR, SQL_LANGUAGE_CONFORMANCE, SQL_LANGUAGE_INTEGRITY, SQL_LANGUAGE_IMPLEMENTATION, SQL_LANGUAGE_BINDING_STYLE, SQL_LANGUAGE_PROGRAMMING_LANGUAGE FROM DEFINITION_SCHEMA.SQL_LANGUAGES



Представление TABLE_CONSTRAINTS


Представление идентифицирует табличные ограничения, определенные в данном каталоге и принадлежащие данному пользователю. Представление определяется следующим образом:

CREATE VIEW TABLE_CONSTRAINTS

AS SELECT CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA, CONSTRAINT_NAME, TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, CONSTRAINT_TYPE, IS_DEFERRABLE, INITIALLY_DEFERRED FROM DEFINITION_SCHEMA.TABLE_CONSTRAINTS JOIN DEFINITION_SCHEMA.SCHEMATA S ON ((CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA) = (S.CATALOG_NAME, S.SCHEMA_NAME)) WHERE SCHEMA_OWNER = CURRENT_USER AND CONSTRAINT_CATALOG = (SELECT CATALOG_NAME FROM INFORMATION_SCHEMA_CATALOG_NAME)



Представление TABLE_PRIVILEGES


Представление идентифицирует привилегии для таблиц, определенных в данном каталоге, которые доступны данному пользователю или переданы им. Определение представления:

CREATE VIEW TABLE_PRIVILEGES AS SELECT GRANTOR, GRANTEE, TABLE_CATALOG, TABLE_SCHEMA, ABLE_NAME, PRIVILEGE_TYPE, IS_GRANTABLE FROM DEFINITION_SCHEMA.TABLE_PRIVILEGES WHERE GRANTEE IN ('PUBLIC', CURRENT_USER) OR GRANTOR = CURRENT_USER AND TABLE_CATALOG = (SELECT CATALOG_NAME FROM INFORMATION_SCHEMA_CATALOG_NAME)



Представление TABLES


Представление идентифицирует таблицы, определенные в данном каталоге и доступные данному пользователю. Представление определяется следующим образом:

CREATE VIEW TABLES AS SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE FROM DEFINITION_SCHEMA.TABLES WHERE (TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME) IN (SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME FROM DEFINITION_SCHEMA.TABLE_PRIVILEGES WHERE GRANTEE IN ('PUBLIC', CURRENT_USER) UNION SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME FROM DEFINITION_SCHEMA.COLUMN_PRIVILEGES WHERE GRANTEE IN ('PUBLIC', CURRENT_USER)) AND TABLE_CATALOG = (SELECT CATALOG_NAME FROM INFORMATION_SCHEMA_CATALOG_NAME)



Представление USAGE_PRIVILEGES


Представление идентифицирует привилегии USAGE для объектов, определенных в данном каталоге, которые доступны данному пользователю или переданы им. Определение представления:

CREATE VIEW USAGE_PRIVILEGES AS SELECT GRANTOR, GRANTEE, OBJECT_CATALOG, OBJECT_SCHEMA, OBJECT_NAME, OBJECT_TYPE, 'USAGE' AS PRIVILEGE_TYPE, IS_GRANTABLE FROM DEFINITION_SCHEMA.USAGE_PRIVILEGES WHERE GRANTEE IN ('PUBLIC', CURRENT_USER) OR GRANTOR = CURRENT_USER AND OBJECT_CATALOG = (SELECT CATALOG_NAME FROM INFORMATION_SCHEMA_CATALOG_NAME)



Представление VIEW_COLUMN_USAGE


Представление идентифицирует столбцы, от которых зависят представления, определенные в данном каталоге и принадлежащие данному пользователю. Определение представления:

CREATE VIEW VIEW_COLUMN_USAGE AS SELECT VIEW_CATALOG, VIEW_SCHEMA, VIEW_NAME, TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME FROM DEFINITION_SCHEMA.VIEW_COLUMN_USAGE JOIN DEFINITION_SCHEMA.SCHEMATA S ON ((TABLE_CATALOG, TABLE_SCHEMA) = (S.CATALOG_NAME, S.SCHEMA_NAME)) WHERE SCHEMA_OWNER = CURRENT_USER AND VIEW_CATALOG = (SELECT CATALOG_NAME FROM INFORMATION_SCHEMA_CATALOG_NAME)