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> ::= См. пояснения ниже
Пояснения:
- Прямые операторы манипулирования данными (directSQLdatastatement) не должны содержать спецификацию параметров, спецификацию динамических параметров и спецификацию переменных.
- Спецификация значения, представляющего неопределенное значение, определяется в реализации.
- Синтаксические правила для прямых операторов, определяемых в реализации, (directimplementation-definedstatement) определяются в реализации.
- Инициирующими транзакцию являются следующие прямые операторы SQL:
(a) операторы, являющиеся инициирующими транзакцию операторами, которые могут входить в SQL-процедуру;
(b) прямой оператор выборки, возвращающий несколько строк (directselectstatement: multiplerows);
(c) инициирующий транзакцию прямой оператор, определяемый в реализации.
- После последнего вызова оператора SQLSQL-агентом в SQL-сессии происходит следующее:
(a) выполняется оператор ROLLBACK или оператор COMMIT; если возникает невосстанавливаемая ошибка или если прямой вызов SQL завершается непредусмотренным образом (это определяется в реализации), или если не удовлетворяется некоторое ограничение, то выполняется оператор ROLLBACK; в противном случае выбор между выполнением операторов ROLLBACK и COMMIT определяется в реализации;
(b) пусть D - имя дескриптора в некоторой области дескрипторов, который выделен в пределах текущей сессии; тогда выполняется следующий оператор: DEALLOCATEDESCRIPTORD;
(c) все SQL-сессии, связанные с данным SQL-агентом, завершаются.
- Пусть S обозначает прямой оператор SQL.
- Текущим идентификатором авторизации для выполнения S является идентификатор авторизации SQL-сессии.
- При вызове 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 выполняется.
- Если в одной транзакции происходит вызов прямого оператора манипулирования данными и оператора манипулирования схемой и это не допускается реализацией, возбуждается исключительное условие.
- Если выполнение S завершилось успешно, то вырабатывается условие завершения "успешное выполнение", либо "предупреждение", либо "нет данных".
- Если выполнение S завершилось неуспешно, то все изменения, произведенные S над данными или над схемой, ликвидируются, и возбуждается исключительное условие.
- Диагностическая информация по поводу выполнения S помещается в область диагностики; способ доступа к диагностической информации определяется в реализации, но в любом случае содержимое области диагностики не меняется.
Как видно из синтаксических правил, определяющих набор прямых операторов SQL, в состав этого набора входит специальный оператор выборки, не употребляемый в других контекстах и потому не рассмотренный нами ранее. Синтаксис этого оператора следующий:
<direct select statement: multiple rows> ::=
<query expression> [ <order by clause> ]
Пояснения:
- Как видно, синтаксис этого оператора очень напоминает синтаксис спецификации курсора: отсутствует только раздел изменяемости (updatabilityclause). Однако, поскольку это прямой оператор, то в его выражении запроса и разделе сортировки не должны содержаться спецификации значений, отличные от литералов, CURRENT_USER, SESSION_USER и SYSTEM_USER.
- Пусть Q обозначает результат вычисления выражения запроса.
- Если Q пусто, то вырабатывается условие завершения оператора "нет данных".
- Если оператор не содержит раздела сортировки, то порядок строк в Q зависит от реализации; иначе порядок строк устанавливается в соответствии с параметрами раздела сортировки.
- Если 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))
Пояснения:
- Значением столбца CATALOG_NAME является имя каталога, в котором располагается информационная схема.
- Определяется утверждение целостности 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
Пояснения:
- Домен специфицирует все символьные строки переменного размера, которые соответствуют правилам формирования SQL-идентификатора; средствами SQL невозможно определить ограничение домена, которое было бы истинно для допустимых идентификаторов и ложно для других значений.
- 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).
Назад |
Содержание |
Вперед