Исходники.Ру - Программирование
Исходники
Статьи
Книги и учебники
Скрипты
Новости RSS
Магазин программиста
Ishodniki.Ru » Online книги » SQL книги » Введение в стандарты языка баз данных SQL

3.5. Средства определения и манипулирования схемой

Как и в SQL/89, в SQL/92 существует оператор определения схемы, с помощью которого можно за одно обращение к СУБД создать все необходимые объекты, связанные с указанным идентификатором авторизации. Этот оператор имеет следующий синтаксис:

<schema definition> ::=
       CREATE SCHEMA <schema name clause>
       [ <schema character set specification> ]
       [ <schema element>... ]
<schema name clause> ::=
       <schema name>
       |AUTHORIZATION <schema authorization identifier>
       <schema name> AUTHORIZATION <schema authorization identifier>
<schema authorization identifier> ::=
       <authorization identifier>
<schema character set specification> ::=
       DEFAULT CHARACTER SET <character set specification>
<schema element> ::=
       <domain definition>
       |<table definition>
       |<view definition>
       |<grant statement>
       |<assertion definition>
       |<character set definition>
       |<collation definition>
       |<translation definition>

Пояснения:

  1. Если имя схемы не специфицировано, но неявно в качестве имени схемы используется идентификатор авторизации схемы.
  2. Если в определении схемы отсутствует раздел AUTHORIZATION, то
      (a) если определение схемы содержится в модуле, то в качестве идентификатора авторизации схемы используется идентификатор авторизации модуля;
      (b) иначе, в качестве идентификатора авторизации схемы используется идентификатор авторизации SQL-сессии.
  3. При выполнении оператора определения схемы создаются объекты, определяемые элементами схемы (базовые таблицы, представления, ограничения, домены, утверждения целостности, наборы символов, привилегии и т.д.), и их соответствующие описатели.

В отличие от SQL/89, (a) операторы, используемые для определения элементов схемы, можно использовать независимо, вне оператора определения схемы и (b) созданную ранее схему можно уничтожить. Для уничтожения схемы используется оператор DROPSCHEMA, определяемый следующим синтаксисом:

<drop schema statement> ::=
       DROP SCHEMA <schema name> <drop behavior>
<drop behavior> ::= CASCADE RESTRICT

Пояснения:

  1. Имя схемы должно идентифицировать существующую схему.
  2. Если специфицировано RESTRICT, то к моменту выполнения оператора DROPSCHEMA схема не должна содержать какие бы то ни было объекты (постоянные базовые таблицы, глобальные временные таблицы, создаваемые локальные временные таблицы, представления и т.д.); эти объекты должны быть ранее уничтожены соответствующими индивидуальными операторами (см. п. 3.5.6).
  3. Если специфицировано CASCADE, то такие объекты уничтожаются при выполнении оператора DROPSCHEMA путем неявного вызова соответствующих операторов.
  4. При выполнении оператора DROPSCHEMA указанная схема и ее описание уничтожаются.

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

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

<table definition> ::=
       CREATE [ { GLOBAL LOCAL } TEMPORARY ] TABLE
       <table name> <table element list>
       [ ON COMMIT { DELETE PRESERVE } ROWS ]
<table element list> ::=
       <left paren> <table element>
       [ { <comma> <table element> }... ] <right paren>
<table element> ::=
       <column definition>
       |<table constraint definition>

Пояснения:

  1. Если определение таблицы содержится в определении схемы и имя таблицы содержит имя схемы, то это имя схемы должно быть таким же, как явно или неявно специфицированное имя схемы в определении схемы.
  2. Схема, идентифицируемая явным или неявным именем схемы, входящим в имя таблицы, не должна содержать таблиц с тем же именем.
  3. Если указано ONCOMMIT, то должно быть указано и TEMPORARY.
  4. Если указано TEMPORARY и не указано ONCOMMIT, то неявно предполагается наличие ONCOMMITDELETEROWS.
  5. Определение таблицы должно содержать по крайней мере одно определение столбца.
  6. При выполнении оператора определения таблицы создается набор описателей привилегий, определяющих привилегии INSERT, SELECT, UPDATE, DELETE и REFERENCES на этой таблице и INSERT, SELECT, UPDATE и REFERENCES для каждого определения столбца. Все привилегии являются передаваемыми и относящимися к идентификатору авторизации из определения схемы или модуля в зависимости от того, где выполняется оператор определения таблицы.

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

<column definition> ::=
       <column name> { <data type> <domain name> }
       [ <default clause> ]
       [ <column constraint definition>... ]
       [ <collate clause> ]
<column constraint definition> ::=
       [ <constraint name definition> ]
       <column constraint>
       [ <constraint attributes> ]
<constraint name definition> ::= CONSTRAINT <constraint name>
<column constraint> ::=
       NOT NULL
       |<unique specification>
       |<references specification>
       |<check constraint definition>
<constraint attributes> ::=
       <constraint check time> [ [ NOT ] DEFERRABLE ]
       |[ NOT ] DEFERRABLE [ <constraint check time> ]

Пояснения:

  1. Определение столбца может входить в определение таблицы, объявление временной таблицы и в оператор изменения схемы таблицы (ALTERTABLE). Пусть T обозначает соответствующую таблицу. Имя столбца в определении столбца должно отличаться от имени любого существующего столбца таблицы T.
  2. i-тый столбец таблицы описывается i-тым определением столбца в определении таблицы. Имя и тип данных или домен столбца специфицируется именем столбца и типом данных или именем домена соответственно. Пусть C - имя столбца из определения столбца.
  3. Если в определение столбца входит определение ограничения столбца, то пусть 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.5.2. Определение ограничений целостности

В стандарте 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.

Пояснения:

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

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

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

Пояснения:

  1. Пусть T обозначает таблицу, для которой определяется ограничение уникальности, а UCL - список столбцов уникальности.
  2. Если в спецификации уникальности содержится ключевое слово PRIMARYKEY, то пусть SC обозначает условие поиска UNIQUE (SELECTUCLFROMT) AND (UCL) ISNOTNULL
  3. Если в спецификации уникальности содержится ключевое слово UNIQUE, то пусть SC обозначает условие поиска UNIQUE (SELECTUCLFROMT)
  4. Определение таблицы должно содержать не более одного явного или неявного определения ограничения уникальности со спецификацией PRIMARYKEY.
  5. Ограничение уникальности не удовлетворяется в том и только в том случае, когда истинно условие 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

Пояснения:

  1. Ссылающейся таблицей мы будем называть таблицу, фигурирующую в определении таблицы или изменении схемы таблицы (операторе ALTERTABLE). Таблицей, на которую указывает ссылка, будем называть таблицу, имя которой указывается в разделе referencedtableandcolumns. Ссылающимися столбцами будем называть столбцы, перечисленные в списке столбцов-ссылок (referencecolumnlist).
  2. Если в разделе referencedtableandcolumns специфицирован список столбцов, то набор имен столбцов из этого списка должен совпадать с набором столбцов уникальности, содержащемся в ограничении уникальности таблицы, на которую указывает ссылка.
  3. Если раздел referencedtableandcolumns не содержит списка столбцов, то для таблицы, на которую указывает ссылка, должно быть определено ограничение уникальности с ключевым словом PRIMARYKEY.
  4. Ограничение уникальности для таблицы, на которую указывает ссылка, должно не быть откладываемым.
  5. Таблица, на которую указывает ссылка, должна быть базовой и,
      (a) если ссылающаяся таблица является постоянной базовой, то и таблица, на которую указывает ссылка, должна быть постоянной базовой;
      (b) если ссылающаяся таблица является глобальной временной, то и таблица, на которую указывает ссылка, должна быть глобальной временной;
      (c) если ссылающаяся таблица является создаваемой локальной временной, то и таблица, на которую указывает ссылка, должна быть создаваемой локальной временной;
      (d) если ссылающаяся таблица является объявляемой локальной временной, то таблица, на которую указывает ссылка, должна быть либо глобальной временной, либо создаваемой локальной временной, либо объявляемой локальной временной.
  6. Если таблица, на которую указывает ссылка является временной со спецификацией ONCOMMITDELETEROWS, то и для ссылающейся таблицы должно быть специфицировано ONCOMMITDELETEROWS.
  7. В списке ссылающихся столбцов должно содержаться то же число имен столбцов, что задается разделом referencedtableandcolumns. i-тый столбец, идентифицируемый списком ссылающихся столбцов соответствует i-тому столбцу, идентифицированному в разделе referencedtableandcolumns. Типы данных соответствующих столбцов должны совпадать.
  8. Если в определении ссылочного ограничения не специфицировано правило модификации (updaterule), то по умолчанию предполагается наличие такого правила с действием NOACTION.
  9. Если в определении ссылочного ограничения не специфицировано правило удаления (deleterule), то по умолчанию предполагается наличие такого правила с действием NOАCTION.
  10. Пусть Rf обозначает ссылающиеся столбцы, а Rt - соответствующие столбцы в таблице, на которую указывает ссылка. Ссылающаяся таблица и таблица, на которую указывает ссылка, удовлетворяют ссылочному ограничению в том и только в том случае, когда:
      (a) тип соответствия (matchtype) не указан, и для каждой строки ссылающейся таблицы истинно условие RfMATCH (SELECTRtFROMT);
      (b) указан тип соответствия PARTIAL, и для каждой строки ссылающейся таблицы истинно условие RfMATCHPARTIAL (SELECTRtFROMT);
      (c) указан тип соответствия FULL, и для каждой строки ссылающейся таблицы истинно условие RfMATCHFULL (SELECTRtFROMT).
  11. Если не указан тип соответствия или если указан тип соответствия FULL, то для данной строки таблицы, на которую указывает ссылка, соответствующими являются все строки ссылающейся таблицы, значения полей ссылающихся столбцов которых равны значениям соответствующих столбцов строки, на которую указывает ссылка.
  12. Если указан тип соответствия PARTIAL, то
      для данной строки таблицы, на которую указывает ссылка, соответствующими являются все строки ссылающейся таблицы, содержащие по крайней мере одно не неопределенное значение ссылающегося столбца, причем все не неопределенные значения столбцов этих строк совпадают со значениями соответствующих столбцов строки, на которую указывает ссылка;
      для данной строки таблицы, на которую указывает ссылка, уникально соответствующими являются все соответствующие только ей строки; другие соответствующие строки называются неуникально соответствующими.
  13. Для каждой строки таблицы, на которую указывает ссылка, соответствующие, уникально и неуникально соответствующие ей строки определяются непосредственно до выполнения любого оператора SQL. Во время выполнения оператора новые соответствующие строки не добавляются. Связь между неуникально соответствующими строками уничтожается в ходе выполнения оператора SQL, если строка, на которую ведет ссылка помечается для удаления или для изменения значения любого столбца, соответствующего не неопределенному ссылающемуся столбцу. Это происходит сразу после такой пометки. Сразу после этого происходит обнаружение новых уникально или неуникально соответствующих строк.
  14. Если специфицировано правило удаления, и строка таблицы, на которую указывает ссылка, помечается для удаления, то
      (a) если тип соответствия не специфицирован или если специфицирован тип соответствия FULL, то
      (i) если в правиле удаления указано CASCADE, то все соответствующие строки помечаются для удаления;
      (ii) если в правиле удаления указано SETNULL, то во всех соответствующих строках в каждый ссылающийся столбец заносится неопределенное значение;
      (iii) если в правиле удаления указано SETDEFAULT, то во всех соответствующих строках в каждый ссылающийся столбец заносится соответствующее значение по умолчанию;
      (b) если специфицирован тип соответствия PARTIAL, то
      (i) если в правиле удаления указано CASCADE, то все уникально соответствующие строки помечаются для удаления;
      (ii) если в правиле удаления указано SETNULL, то во всех уникально соответствующих строках в каждый ссылающийся столбец заносится неопределенное значение;
      (iii) если в правиле удаления указано SETDEFAULT, то во всех уникально соответствующих строках в каждый ссылающийся столбец заносится соответствующее значение по умолчанию.
  15. Если специфицировано правило модификации, и не неопределенное значение столбца в таблице, на которую указывает ссылка, изменяется на некоторое другое значение, то
      (a) если тип соответствия не специфицирован или если специфицирован тип соответствия FULL, то
      (i) если в правиле удаления указано CASCADE, то во всех соответствующих столбцах проставляется то же самое новое значение;
      (ii) если в правиле модификации указано SETNULL, то
      (*) если тип соответствия не указан, то во всех соответствующих строках в ссылающийся столбец, соответствующий измененному столбцу таблицы, на которую указывает ссылка, выставляется неопределенное значение;
      (**) если указан тип соответствия FULL, то во всех соответствующих строках в каждый ссылающийся столбец заносится неопределенное значение;
      (iii) если в правиле модификации указано SETDEFAULT, то во всех соответствующих строках в ссылающийся столбец, соответствующий измененному столбцу таблицы, на которую указывает ссылка, заносится значение по умолчанию;
      (b) если указан тип соответствия PARTIAL, то
      (i) если в правиле модификации указано CASCADE, то для каждой уникально соответствующей строки, содержащей не неопределенное значение в ссылающемся столбце C1, который соответствует изменяемому столбцу C2, в столбец C1 заносится новое значение столбца C2;
      (ii) если в правиле модификации указано SETNULL, то во всех уникально соответствующих строках, содержащих не неопределенное значение в ссылающемся столбце, который соответствует изменяемому столбцу, проставляется неопределенное значение;
      iii) если в правиле модификации указано SETDEFAULT, то во всех уникально соответствующих строках, содержащих не неопределенное значение в ссылающемся столбце, который соответствует изменяемому столбцу, проставляется значение по умолчанию;
  16. Все строки, помеченные для удаления, реально удаляются в конце выполнения оператора SQL до проверки каких-либо ограничений целостности.

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

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

Пояснения:

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

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

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

Пояснения:

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

3.5.3. Оператор изменения схемы таблицы

Оператор изменения схемы таблицы (ALTERTABLE), для которого не было аналогов в стандарте SQL/89, предназначен для изменений в начальном определении таблицы. Оператор имеет следующий синтаксис:

<alter table statement> ::=
       ALTER TABLE <table name> <alter table action>
<alter table action> ::=
       <add column definition>
       |<alter column definition>
       |<drop column definition>
       |<add table constraint definition>
       |<drop table constraint definition>

Пояснения:

  1. Можно изменять схему любой базовой таблицы за исключением объявляемой локальной временной таблицы.

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

<add column definition> ::=
       ADD [ COLUMN ] <column definition>

Пояснения:

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

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

<alter column definition> ::=
       ALTER [ COLUMN ] <column name> <alter column action>
<alter column action> ::=
       <set column default clause>
       |<drop column default clause>
<set column default clause> ::=
       SET <default clause>
<drop column default clause> ::=
       DROP DEFAULT

Пояснения:

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

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

<drop column definition> ::=
       DROP [ COLUMN ] <column name> <drop behavior>
<drop behavior> ::= CASCADE | RESTRICT

Пояснения:

  1. Если в определении удаления столбца указано RESTRICT, то на удаляемый столбец не должно быть ссылок в выражении запроса любого существующего представления и в условии поиска любого существующего ограничения, кроме табличных ограничений, ссылающихся только на этот столбец и входящих в описание данной таблицы.
  2. Если в определении удаления столбца указано CASCADE, то любой зависимый объект уничтожается при выполнении неявного оператора REVOKE (см. ниже).
  3. Пусть A обозначает текущий идентификатор авторизации. Пусть T - имя таблицы, для которой выполняется оператор ALTERTABLE, а C - имя удаляемого столбца. Тогда при удалении столбца неявно выполняется следующий оператор от имени текущего системного идентификатора авторизации: REVOKEINSERT(CN), UPDATE(CN), REFERENCES(CN) ONTABLETN FROMACASCADE.
  4. Пусть V - имя любого представления, ссылающегося на столбец C таблицы T. При удалении столбца неявно выполняется следующий оператор от имени текущего системного идентификатора авторизации: DROPVIEWVNCASCADE.
  5. Идентифицируемый столбец и его описатель уничтожаются.
  6. Степень T уменьшается на единицу. Порядковые номера всех столбцов с порядковым номером больше чем у C уменьшаются на единицу.

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

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

Это определение не нуждается в пояснениях.

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

<drop table constraint definition> ::=
       DROP CONSTRAINT <constraint name> <drop behavior>

Пояснения:

  1. Пусть T имя таблицы, упоминаемой в операторе ALTERTABLE, а TC - имя уничтожаемого ограничения целостности.
  2. Если TC является ограничением уникальности и существует ссылочное ограничение RC со ссылкой на таблицу T по столбцам уникальности TC, то будем говорить, что RC зависит от TC.
  3. Если указано RESTRICT, то никакое табличное ограничение не должно зависеть от TC.
  4. Если указано CASCADE, то все зависимые объекты уничтожаются при выполнении неявного оператора ALTERTABLE (см. ниже).
  5. Пусть TCN2 - имя любого табличного ограничения, зависящего от TC, и пусть T2 - имя таблицы, определение которой включало TCN2. Тогда выполняется неявный оператор ALTERTABLET2 DROPCONSTRAINTTCN2 CASCADE.
  6. Описатель TC удаляется из описания таблицы T.
  7. Идентифицированное табличное ограничение и его описатель разрушаются.

3.5.4. Средства определения представлений

Представляемая таблица, или просто представление создается с помощью оператора CREATEVIEW, который похож на соответствующий оператор языка SQL/89, но обладает существенно расширенными возможностями. Для полноты мы опишем этот оператор достаточно подробно. Как обычно, начнем со сводки синтаксических правил:

<view definition> ::=
       CREATE VIEW <table name> [ <left paren> <view column list>
       <right paren> ]
       AS <query expression>
       [ WITH [ <levels clause> ] CHECK OPTION ]
<levels clause> ::=
       CASCADED | LOCAL
<view column list> ::= <column name list>

Пояснения:

  1. Выражение запроса не должно содержать спецификацию цели или динамического параметра.
  2. Имя определяемого представления не должно содержаться в какой-либо ссылке на таблицу, содержащейся в выражении запроса (другими словами, не допускаются рекурсивные определения представлений).
  3. В выражении запросов не должны встречаться имена временных объявляемых таблиц.
  4. Если выражение запроса является обновляемым, то и определяемое представление является обновляемым. В противном случае представляемая таблица - только читаемая.
      (a) выражение запроса является обновляемым в том и только в том случае, когда содержит только выражение запроса QE или спецификацию запроса QS и
      (i) выражение запроса содержит QS или QS, не включающие выражение запроса без соединения с операторами UNION или EXCEPT;
      (ii) выражение запроса содержит QE или QS, не включающие терм запроса без соединения с оператором INTERSECT;
      (iii) QE или QS являются обновляемыми;
      (b) спецификация запроса QS является обновляемой в том и только в том случае, когда
      (i) в QS не специфицировано DISTINCT;
      (ii) каждое выражение, содержащееся в списке выборки QS, состоит из ссылки на столбец, и ни одна ссылка на столбец не появляется более одного раза;
      (iii) раздел FROM табличного выражения, непосредственно входящего в QS, содержит в точности одну ссылку на таблицу, указывающую на базовую таблицу или на обновляемую порождаемую таблицу;
      (iv) таблица, на которую содержится ссылка в разделе FROM верхнего уровня, не должна использоваться в подзапросах, входящих в раздел FROM;
      (v) табличное выражение, непосредственно содержащееся в QS, не должно включать разделы GROUPBY и HAVING;
      (c) порождаемая таблица является обновляемой в том и только в том случае, когда обновляемым является выражение запроса, содержащееся в табличном подзапросе;
      (d) соответствующие синтаксические правила и пояснения содержатся в разд. 3.3 (мы сознательно не говорили в этом разделе о правилах обновляемости, потому что они больше связаны с представлениями).
  5. Число имен столбцов в списке столбцов представления должно совпадать со степенью таблицы, специфицированной выражением запроса.
  6. Если в определении представления содержится раздел WITHCHECKOPTION, то представление должно быть обновляемым.
  7. Если специфицировано WITHCHECKOPTION без задания раздела уровней (levelsclause), то по умолчанию полагается указание класса CASCADED.
  8. Если в определении представления специфицирован список столбцов представления, то i-тый столбец представления имеет i-тое имя из этого списка. В противном случае имена столбцов представления совпадают с именами столбцов таблицы, специфицируемой выражением запроса.
  9. Набор привилегий, которые получает создатель по отношению к определяемому представлению, определяется сравнительно громоздким набором правил и в конечном счете зависит от набора привилегий, которыми располагает создатель по отношению к базовым таблицам, лежащим в основе представления, и от того, является ли представление обновляемым.
  10. В соответствии с правилами обновляемости представления, для каждой строки обновляемого представления существует и только одна строка базовой таблицы, на которой в конечном счете основывается это представление. Занесение новой строки, удаление или модификация существующей строки приводит к выполнению соответствующей операции над строками этой базовой таблицы.
  11. Пусть V1 - представление. По определению V1 перекрывает (span) V1, и V1 перекрывает представление V2, если V2 используется в определении V1.
  12. Под операцией обновления понимаются операция INSERT и позиционная, поисковая, динамическая позиционная и подготавливаемая динамическая позиционная операции UPDATE.
  13. Если представление V1 перекрывает представление V2, в определении V2 содержался раздел WITHCHECKOPTION, и в результате выполнения операции обновления V1 возникает строка, невидимая в V2, то
      (a) если в определении V1 было указано CASCADED, то вырабатывается исключительное условие;
      (b) если в определении V1 было указано LOCAL и в результате выполнения операции обновления возникает строка, видимое в таблице, на которой непосредственно определено представление V2, то вырабатывается исключительное условие.
  14. Проверка ограничения WITHCHECKOPTION выполняется в конце каждой операции обновления.

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

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

<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).

Пояснения:

  1. Пусть D1 - некоторый домен. D1 используется в ограничении домена DC в том и только в том случае, когда условие поиска DC содержит либо имя D1, либо имя некоторого ограничения домена D2. Домен не может использоваться в своем собственном ограничении.
  2. Для каждого ограничения домена
      (a) если атрибуты ограничения неспецифицированы, неявно полагаются указанными атрибуты INITIALLYIMMEDIATENOTDEFERRABLE.
      (b) если неспецифицировано имя ограничения, по умолчанию неявно предполагается указание имени ограничения, зависящего от реализации.
  3. Пусть DSC обозначает условие поиска, входящее в ограничение домена DCD. Пусть D - имя этого домена, а T - имя некоторой таблицы со столбцом C, определенным на домене D. Пусть CSC обозначает копию DSC, в которой каждое вхождение VALUE заменено на C.
  4. Ограничение 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

Пояснения:

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

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

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

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

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

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

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

3.5.6. Средства уничтожения элементов схемы базы данных

Для каждого из упомянутых в этом разделе операторов создания элементов схемы базы данных имеются обратные операторы уничтожения этих элементов.

Созданная ранее таблица может быть уничтожена следующим оператором:

<drop table statement> ::=
       DROP TABLE <table name> <drop behavior>

Пояснения:

  1. Пусть уничтожается таблица с именем T.
  2. T должна быть базовой таблицей.
  3. T не должна быть временной объявляемой таблицей.
  4. Если специфицировано RESTRICT, то ни в каком существующем представлении и ни в каком условии поиска существующего ограничения не должны содержаться ссылки на T.
  5. Пусть A обозначает текущий идентификатор авторизации. Тогда при выполнении оператора уничтожения таблицы неявно выполняется следующий оператор: REVOKEALLPRIVILEGESONTFROMACASCADE, что при наличии спецификации CASCADE в операторе уничтожения таблицы приводит к уничтожению всех объектов, в определении которых использовалась ссылка на T.
  6. Таблица T и ее дескриптор уничтожаются.

Созданное ранее представление может быть уничтожено с помощью следующего оператора:

<drop view statement> ::=
       DROP VIEW <table name> <drop behavior>

Пояснения:

  • Пусть V - имя уничтожаемого представления.
  • V должно быть именем представляемой таблицы.
  • Если специфицировано RESTRICT, то ни в одном существующем представлении или условии поиска существующего ограничения не должна содержаться ссылка на V.
  • Пусть A обозначает текущий идентификатор авторизации. При выполнении оператора уничтожения представления неявно выполняется следующий оператор: REVOKEALLPRIVILEGESONTFROMACASCADE, что при наличии спецификации CASCADE в операторе уничтожения представления приводит к уничтожению всех объектов, в определении которых использовалась ссылка на V.

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

    <drop domain statement> ::=
           DROP DOMAIN <domain name> <drop behavior>
    

    Пояснения:

    1. Пусть D - имя уничтожаемого домена.
    2. Если специфицировано RESTRICT, то ссылки на D должны отсутствовать в любом описателе столбца, в выражении запроса любого представления и в условии поиска любого ограничения.
    3. Пусть C обозначает описатель столбца, определенного на домене D; T - имя таблицы, описатель которой включает C. C модифицируется следующим образом:
        (a) из C удаляется ссылка на D, и в C включается копия описателя типа данных D;
        (b) если C не включает раздела значения по умолчанию, а описатель D включает такой раздел, то в C включается раздел умолчания D;
        (c) для каждого описателя ограничения домена D выполняются следующие действия:
        (i) пусть TCD обозначает табличное ограничение с определяемым в реализации именем, которое порождено из проверочного ограничения домена путем замены VALUE на имя столбца C с сохранением атрибутов ограничения;
        (ii) если для идентификатора полномочий текущей SQL-сессии имеются необходимые привилегии, выполняется неявный оператор ALTERTABLETADDTCD;
    4. Пусть A - текущий идентификатор полномочий. Выполняется следующий неявный оператор REVOKE: REVOKEUSAGEONDOMAINDNFROMACASCADE
    5. Описатель домена разрушается.

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

    <drop assertion statement> ::=
           DROP ASSERTION <constraint name>
    

    Пояснение:

    При выполнении оператора описатель идентифицируемого утверждения целостности разрушается.

    Назад | Содержание | Вперед

Рассылка новостей
Рейтинги
© 2007, Программирование Исходники.Ру