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

3.12. Прямой вызов операторов SQL

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

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

<direct SQL statement> ::=
       <directly executable statement> <semicolon>
<directly executable statement> ::=
       <direct SQL data statement>
       | <SQL schema statement>
       | <SQL transaction statement>
       | <SQL connection statement>
       | <SQL session statement>
       | <direct implementation-defined statement>
<direct SQL data statement> ::=
       <delete statement: searched>
       | <direct select statement: multiple rows>
       | <insert statement>
       | <update statement: searched>
       | <temporary table declaration>
<direct implementation-defined statement> ::= См. пояснения ниже

Пояснения:

  1. Прямые операторы манипулирования данными (directSQLdatastatement) не должны содержать спецификацию параметров, спецификацию динамических параметров и спецификацию переменных.
  2. Спецификация значения, представляющего неопределенное значение, определяется в реализации.
  3. Синтаксические правила для прямых операторов, определяемых в реализации, (directimplementation-definedstatement) определяются в реализации.
  4. Инициирующими транзакцию являются следующие прямые операторы SQL:
      (a) операторы, являющиеся инициирующими транзакцию операторами, которые могут входить в SQL-процедуру;
      (b) прямой оператор выборки, возвращающий несколько строк (directselectstatement: multiplerows);
      (c) инициирующий транзакцию прямой оператор, определяемый в реализации.
  5. После последнего вызова оператора SQLSQL-агентом в SQL-сессии происходит следующее:
      (a) выполняется оператор ROLLBACK или оператор COMMIT; если возникает невосстанавливаемая ошибка или если прямой вызов SQL завершается непредусмотренным образом (это определяется в реализации), или если не удовлетворяется некоторое ограничение, то выполняется оператор ROLLBACK; в противном случае выбор между выполнением операторов ROLLBACK и COMMIT определяется в реализации;
      (b) пусть D - имя дескриптора в некоторой области дескрипторов, который выделен в пределах текущей сессии; тогда выполняется следующий оператор: DEALLOCATEDESCRIPTORD;
      (c) все SQL-сессии, связанные с данным SQL-агентом, завершаются.
  6. Пусть S обозначает прямой оператор SQL.
  7. Текущим идентификатором авторизации для выполнения S является идентификатор авторизации SQL-сессии.
  8. При вызове SSQL-агентом происходит следующее:

      (a) если S - это оператор подключения, то
      (i) очищается область диагностики;
      (ii) S выполняется;
      (iii) если оператор S успешно инициировал или возобновил SQL-сессию, то последующие вызовы операторов прямого SQL данным SQL-агентом связываются с этой сессией, пока SQL-агент не завершит ее или не сделает потенциальной;
      (b) в противном случае:
      (i) если для SQL-агента не существует текущая SQL-сессия, то:
      (*) если SQL-агент не выполнял оператора подключения и с ним не связана SQL-сессия по умолчанию, то выполняется следующий оператор подключения: CONNECTTODEFAULT;
      (**) если SQL-агент не выполнял оператора подключения и с ним связана SQL-сессия по умолчанию, то выполняется следующий оператор установки подключения: SETCONNECTIONDEFAULT;
      (***) в противном случае возникает исключительное условие;
      (ii) если для данного SQL-агента существует активная транзакция, то S связывается с этой транзакцией SQL-transaction; если S - прямой оператор SQL, определяемый в реализации, то в реализации же определяется, может ли S ассоциироваться с текущей транзакцией, если не может, то возбуждается исключительное условие;
      (iii) если для данного SQL-агента не существует активной транзакции, то
      (*) если S является инициирующим транзакцию оператором, то инициируется SQL-транзакция;
      (**) если S является прямым оператором, определяемым в реализации, то в реализации же определяется, инициирует ли S транзакцию; если инициирует, то инициируется SQL-транзакция.
      (***) если оператор S инициировал транзакцию, то пусть T обозначает эту транзакцию; тогда:
      (****) T ассоциируется с данным вызовом и со всеми последующими вызовами прямых операторов SQL и процедур, производимых данным SQL-агентом, до тех пор, пока этот агент не завершит T;
      (*****) если после завершения последней транзакции в данной SQL-сессии был выполнен оператор установки параметров транзакции, то режим доступа, режим проверки ограничений и уровень изоляции T устанавливаются в соответствии с заданными параметрами;
      (******) в противном случае для T устанавливается режим доступа "чтение-запись", режим проверки ограничений "немедленный" и уровень изоляции;
      (*******) T ассоциируется с текущей SQL-сессией;
      (iv) область диагностики очищается;
      (v) S выполняется.

  9. Если в одной транзакции происходит вызов прямого оператора манипулирования данными и оператора манипулирования схемой и это не допускается реализацией, возбуждается исключительное условие.
  10. Если выполнение S завершилось успешно, то вырабатывается условие завершения "успешное выполнение", либо "предупреждение", либо "нет данных".
  11. Если выполнение S завершилось неуспешно, то все изменения, произведенные S над данными или над схемой, ликвидируются, и возбуждается исключительное условие.
  12. Диагностическая информация по поводу выполнения S помещается в область диагностики; способ доступа к диагностической информации определяется в реализации, но в любом случае содержимое области диагностики не меняется.

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

<direct select statement: multiple rows> ::=
       <query expression> [ <order by clause> ]

Пояснения:

  1. Как видно, синтаксис этого оператора очень напоминает синтаксис спецификации курсора: отсутствует только раздел изменяемости (updatabilityclause). Однако, поскольку это прямой оператор, то в его выражении запроса и разделе сортировки не должны содержаться спецификации значений, отличные от литералов, CURRENT_USER, SESSION_USER и SYSTEM_USER.
  2. Пусть Q обозначает результат вычисления выражения запроса.
  3. Если Q пусто, то вырабатывается условие завершения оператора "нет данных".
  4. Если оператор не содержит раздела сортировки, то порядок строк в Q зависит от реализации; иначе порядок строк устанавливается в соответствии с параметрами раздела сортировки.
  5. Если Q непусто, то возвращается оператором, причем используемый способ возврата определяется в реализации.

3.13. Информационная схема и каталоги базы данных

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

Таблицы информационной схемы определяются как содержащиеся в схеме с именем INFORMATION_SCHEMA. Эти таблицы доступны пользователям как любые другие таблицы в любой другой схеме. Привилегия SELECT для всех этих представлений предоставлена PUBLIC с правом передачи привилегии. В результате любой пользователь может адресовать представлениям информационной схемы свои запросы и разрешать или запрещать другим пользователям доступ к представлениям, определенным на основе представлений информационной схемы. Другие привилегии на эти представления не передаются, поэтому пользователи не могут выполнять над ними операции обновления. Кроме того, информационная схема содержит определения ряда доменов, использование которых с правом передачи привилегии на использование доступно всем пользователям.

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

Базовые таблицы, на которых основаны представления информационной схемы, определяются как содержащиеся в схеме с именем DEFINITION_SCHEMA. К объектам схемы определений нельзя адресовать операторы SQL. Поэтому в этом разделе мы перечислим и кратко поясним только объекты информационной схемы. Этого достаточно для того, чтобы оценить стандартность реализации.

3.13.1. Информационная схема

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

CREATE SCHEMA INFORMATION_SCHEMA
       AUTHORIZATION INFORMATION_SCHEMA

3.13.2. Базовая таблица INFORMATION_SCHEMA_CATALOG_NAME

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

CREATE TABLE INFORMATION_SCHEMA_CATALOG_NAME
       (CATALOG_NAME
       SQL_IDENTIFIER,
       CONSTRAINT INFORMATION_SCHEMA_CATALOG_NAME_PRIMARY_KEY
       PRIMARY KEY (CATALOG_NAME))

Пояснения:

  1. Значением столбца CATALOG_NAME является имя каталога, в котором располагается информационная схема.
  2. Определяется утверждение целостности INFORMATION_SCHEMA_CATALOG_ NAME_CARDINALITY, гарантирующее, что в таблице INFORMATION_SCHEMA_ CATALOG_NAME содержится ровно одна строка:
CREATE ASSERTION INFORMATION_SCHEMA_CATALOG_NAME_CARDINALITY
       CHECK (1 = (SELECT COUNT(*)
             FROM INFORMATION_SCHEMA_CATALOG_NAME))

3.13.3. Представление 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)

3.13.4. Представление 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)

3.13.5. Представление 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)

3.13.6. Представление 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)

3.13.7. Представление VIEWS

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

CREATE VIEW VIEWS
       AS SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME,
       CASE WHEN (TABLE_CATALOG, TABLE_SCHEMA, CURRENT_USER)
       IN (SELECT CATALOG_NAME, SCHEMA_NAME, SCHEMA_OWNER
       FROM DEFINITION_SCHEMA.SCHEMATA)
       THEN VIEW_DEFINITION
       ELSE NULL END AS VIEW_DEFINITION,
       CHECK_OPTION, IS_UPDATABLE
       FROM DEFINITION_SCHEMA.VIEWS
       WHERE (TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME)
       IN (SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME
       FROM TABLES)
       AND TABLE_CATALOG
       = (SELECT CATALOG_NAMEFROM
       INFORMATION_SCHEMA_CATALOG_NAME)

3.13.8. Представление 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)

3.13.9. Представление 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)

3.13.10. Представление 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)

3.13.11. Представление 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)

3.13.12. Представление 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)

3.13.13. Представление 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)

3.13.14. Представление 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)

3.13.15. Представление 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)

3.13.16. Представление 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)

3.13.17. Представление 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, поскольку соответствующие понятия не рассматривались в курсе и смысл этих представлений все равно будет непонятен (как мы отмечали, вообще понятия, связанные с использованием национальных наборов символов, трудно использовать обычным пользователям).

3.13.18. Представление VIEW_TABLE_USAGE

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

CREATE VIEW VIEW_TABLE_USAGE
       AS SELECT VIEW_CATALOG, VIEW_SCHEMA, VIEW_NAME,
       TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME
       FROM DEFINITION_SCHEMA.VIEW_TABLE_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)

3.13.19. Представление 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)

3.13.20. Представление 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)

3.13.21. Представление 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)

3.13.22. Представление 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)

3.13.23. Представление 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

3.13.24. Домен SQL_IDENTIFIER

В этом домене содержатся все допустимые идентификаты. Домен определяется следующим образом:

CREATE DOMAIN SQL_IDENTIFIER
       AS CHARACTER VARYING (L) CHARACTER SET SQL_TEXT

Пояснения:

  1. Домен специфицирует все символьные строки переменного размера, которые соответствуют правилам формирования SQL-идентификатора; средствами SQL невозможно определить ограничение домена, которое было бы истинно для допустимых идентификаторов и ложно для других значений.
  2. L обозначает определяемую в реализации максимально допустимую длину идентификатора.

3.13.25. Домен CHARACTER_DATA

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

CREATE DOMAIN CHARACTER_DATA
       AS CHARACTER VARYING (ML) CHARACTER SET SQL_TEXT

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

3.13.26. Домен CARDINAL_NUMBER

Домен содержит неотрицательные целые числа. Его определение:

CREATE DOMAIN CARDINAL_NUMBER
       AS INTEGER CONSTRAINT CARDINAL_NUMBER_DOMAIN_CHECK
       CHECK (VALUE >= 0)

Пояснение: целые числа, входящие в этот домен, не превышают определяемого в реализации максимально допустимого значения целого числа (определяемого в реализации значения NUMERIC_PRECISION_RADIX в степени определяемого в реализации значения NUMERIC_PRECISION).

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

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