SQL_FAQ - WordPress.com

advertisement
Введение в SQL.
1.Управление доступом. Виды привилегий. Основные системные привилегии.
Ответ:
Управление доступом.
Право доступа (permission) - это разрешение, выдаваемое конкретному пользователю, сделать
что-либо в базе данных. Существует два типа прав доступа: объектное(object) и командное
(statement). Объектные права доступа определяют, кто может получить доступ и работать с
данными в таблицах и видах и кто может запускать хранимые процедуры. Командные права
доступа определяют, кто может удалять и создавать объекты в базе данных.
Виды привилегий.
Для управления правами доступа в SQL используются команды GRANT, REVOKE, DENY.
GRANT (Выдать). Назначить объекту некоторые права доступа для разрешения выполнять
действия с этим объектом. Назначив права доступа для команды, вы позволяете выполнять эту
команду.
REVOKE (Аннулировать). Аннулировав права доступа для объекта или команды вы
предотвращаете возможность выполнения каких - либо действий.
DENY (Отказать). Отказав в правах доступа, вы явным образом не разрешаете кому-либо
выполнять действия с объектом, в то время как команда REVOKE просто удаляет эти права.
Объектные права доступа.
Таблица
SELECT, UPDATE, DELETE, INSERT, REFERENCE
Столбец
SELECT, UPDATE
Вид
SELECT, UPDATE, DELETE, INSERT
Хранимая процедура
EXECUTE
Понятие ролей базы данных.
Роли - это новая возможность, которая появилась только в SQL Server 7.0. С их помощью можно
логически сгруппировать пользователей, имеющих соответствующие права доступа. Типы ролей,
имеющихся в версии 7.0: Роли уровня сервера. Описаны в специализированной литературе.
Являются заранее определенными и действуют в пределах сервера. Предоставляют различные
степени доступа к операциям и задачам сервера. Не зависят от конкретных баз данных, и
модифицировать их нельзя.Роли уровня данных. Позволяют назначить набор прав доступа для
работы с конкретной базой данных отдельному пользователю или группе. Роли уровня базы
данных зависят от конкретных баз данных. В SQL Server существует три типа.
Основные системные привилегии.
--
2.Создание пользователя. Привилегии вновь созданного пользователя. Назначение
дополнительных системных привилегий.
Ответ:
Создание пользователя.
Для заведения нового пользователя используется оператор GRANT. Формат его такой:
GRANT LOGIN TO user:password
Здесь user – имя пользователя, password – назначенный ему пароль. Например, для того, чтобы
завести пользователя с именем Elena и паролем PAROL, следует выполнить следующую команду:
GRANT LOGIN TO Elena:PAROL
Привилегии вновь созданного пользователя.
После того, как пользователь занесен в базу данных, он может в неё заходить, но не может
выполнять в ней никаких действий, так как изначально ему всё запрещено. Чтобы пользователь
мог что-либо делать, ему необходимо дать соответствующие права. Для этого используется тот же
оператор GRANT, но немного в другой форме:
GRANT right ON table ‘owner’ TO user
Здесь right –это право, которое требуется дать пользователю по имени user на таблицу table.
Право может быть одно из следующих:
§
§
§
§
§
ALL – все права на таблицу
SELECT – право просматривать данные таблицы
UPDATE – право изменять данные таблицы
INSERT – право добавлять данные в таблицу
DELETE - право удалять данные из таблицы
Обратите внимание, что после указания имени таблицы, на которую требуется дать права, в
одинарных кавычках указывается строка-пароль (owner) для этой таблицы. О том, как его
получить, было написано выше. Соответственно, следующая команда разрешает пользователю
Elena все операции с таблицей ANALIT, пароль которой ‘12345678’:
GRANT ALL ON analit ‘12345678’ TO Elena
Однако полные права рекомендуется давать с большой осторожностью. Как правило, можно
ограничиться только просмотром. Делается это такой командой:GRANT SELECT ON analit
‘12345678’ TO Elena
Назначение дополнительных системных привилегий.
--
3.Роль. Определение. Преимущества ролей. Создание ролей, назначение пользователю.
Ответ:
Роль- именованная группа связанных разрешений выданных пользователю.
Преимущества:
-есть возможность связать определенные разрешения в группу и выдавать с помощью одного
запроса;
-нет необходимости вводить несколько запросов.
Create role manager
Grant …
To manager
Grant manager to Bell, Kochhar
4.Объектные привилегии. Виды, назначение объектных привилегий пользователю. Дальнейшая
передача привилегий.
Привилегии объектов.
Grant object_priv [(columns)]
On object_name
To {user|role|public}
[with grant option] –позволяет выдавать полученные разрешения другим пользователям
(Дальнейшая передача привилегий).
Виды.
§
ALL – все права на таблицу
§
SELECT – право просматривать данные таблицы
§
UPDATE – право изменять данные таблицы
§
INSERT – право добавлять данные в таблицу
§
DELETE - право удалять данные из таблицы
5.Словари, описывающие имеющиеся привилегии. Удаление привилегий, каскадное удаление
ограничений и переданных привилегий.
6.DDL. Изменение структуры таблицы. Изменение, удаления поля таблицы. Опция SET UNUSED.
Ответы:
DDL - Категория SQL-операторов, создающих или удаляющих объекты базы данных, таких, как
таблицы или представления. Примерами являются операторы CREATE, ALTER и DROP.
Изменение структуры таблицы.
Для редактирования таблиц используется конструкция SQL – ALTER TABLE. Чтобы пользователь мог
редактировать таблицу, она должна быть в его схеме, а у пользователя должна быть объектная
привилегия ALTER TABLE, для редактирования таблиц принадлежащих другим пользователям
требуется системная привилегия ALTER ANY TABLE.
Далее приведу допустимые изменения таблиц:
Модификация физических параметров (PCTFREE, PCTUSED, INITRANS, MAXTRANS или
параметров хранения)
Перемещение таблицы в новый сегмент или табличное пространство
Явное выделение экстента или освобождение неиспользуемого пространства
Добавление, удаление или переименование столбцов или модификация существующих
столбцов (изменение типа данных, размерности, значения по умолчанию и ограничение
целостности NOT NULL)
Модификация атрибутов журнализации таблиц
Модификация атрибутов CACHE/NOCACHE
Добавление, модификация или удаление ограничений целостности, связанных с таблицей
Включение или отключение ограничений целостности или триггеров, связанных с таблицей
Изменение степени параллелизма для таблицы
Включение или отключение сбора статистики (MONITORING/NOMONITORING)
Переименование таблицы
Добавление или модификация характеристик индекс-организованных таблиц
Изменение характеристик внешних таблиц
Добавление или модификация столбцов LOB
Добавление или модификация столбцов объектного типа, типа вложенной таблицы или типа varray@@
Добавление столбцов таблицы
Для добавления столбца к существующей таблице используется конструкция ALTER TABLE … ADD. В
следующем примере изменим существующую таблицу ALL_ORACLE.ADMIN_LOG, и добавим
столбец COMMENTS:
ALTER TABLE ALL_ORACLE.ADMIN_LOG
ADD (COMM VARCHAR2 (100));
Добавляемый столбец получает значение NULL, если не указано предложение DEFAULT,
определяющее значение по умолчанию. Если задать значение по умолчанию, то каждая строка
нового столбца примет это значение.
Столбец с ограничением NOT NULL может добавляться к таблице, которая не содержит данных,
либо если для столбца задано значение по умолчанию.
Переименование столбцов таблицы
Изменения поля таблицы.
Oracle позволяет переименовывать существующие столбцы таблицы. Для переименования
используется предложение RENAME COLUMN в ALTER TABLE. Новое имя столбца не должно
конфликтовать с уже существующими столбцами. Вместе с предложением RENAME COLUMN
нельзя указывать другие предложения.
В следующем примере переименуем столбец COMM таблицы ALL_ORACLE.ADMIN_LOG:
ALTER TABLE ALL_ORACLE.ADMIN_LOG
RENAME COLUMN COMM TO COMMENTS;
Переименование столбца автоматически обновляются соответствующие таблицы словаря данных,
чтобы оставить действительными индексы на базе функций и проверочные ограничения
целостности.
Переименование таблицы
Для переименования таблицы используется синтаксис похожий на конструкцию для
переименования столбца таблицы. Что бы переименовать таблицу выполняется конструкция
ALTER TABLE … RENAME TO.
Удаление столбцов таблицы
Столбцы, которые больше не нужны можно удалить из таблицы. Это хороший способ для
освобождения пространства в базе данных.
Нельзя удалить из таблицы все столбцы сразу, а так же удалять столбцы из таблиц
принадлежащих пользователю SYS.
Удаление столбцов из таблицы
Для удаления используется конструкция ALTER TABLE … DROP COLUMN. В результате удаляется
дескриптор столбца и данные, связанные с целевым столбцом. В одной конструкции можно
удалить сразу несколько столбцов. Приведенные примеры проиллюстрируют это:
ALTER TABLE ALL_ORACLE.ADMIN_LOG DROP COLUMN COMMENTS;
А теперь удалим два столбца сразу DATE_TIME и EVENT
ALTER TABLE ALL_ORACLE.ADMIN_LOG DROP (DATE_TIME , EVENT);
Пометка столбцов как неиспользуемых. Опция SET UNUSED.
Если удаление данных из столбцов из всех строк занимает слишком много времени, можно
использовать оператор ALTER TABLE … SET UNUSED. Он позволяет пометить один или более
столбцов как неиспользуемые. Реального удаления не происходит, и как следствие не происходит
высвобождения пространства.
Помеченный, как неиспользуемый, столбец не выводится в запросах и представлениях словаря
данных. Кроме того, его имя освобождается и его можно использовать для нового столбца в этой
таблице. Удаляются все ограничения целостности, индексы и статистики определенные в этом
столбце.
Для пометки столбцов как неиспользуемых нужно выполнить:
ALTER TABLE ALL_ORACLE.ADMIN_LOG SET UNUSED (DATE_TIME , EVENT);
В дальнейшем столбцы помеченные как неиспользуемые можно удалить, выполнив ALTER TABLE
… DROP UNUSED COLUMNS.
Для того, чтобы узнать в каких таблицах содержаться неиспользуемые столбцы можно выполнить
запрос к представлениям словаря данных:
USER_UNUSED_COL_TABS
ALL_UNUSED_COL_TABS
DBA_UNUSED_COL_TABS
Поле COUNT отображает количество неиспользуемых столбцов в таблице.
SELECT * FROM DBA_UNUSED_COL_TABS;
Вернет:
OWNER
TABLE_NAME
COUNT
------------- ------------------------------ -----ALL_ORACLE ADMIN_LOG
2
Удаление неиспользуемых столбцов
ALTER TABLE … DROP UNUSED COLUMNS – единственное действие которое допускается для
неиспользуемых столбцов. Оно физически удаляет неиспользуемые столбцы из таблицы и
освобождает пространство.
Использование ключевого слова CHECKPOINT позволяет создавать контрольную точку после
обработки указанного количества строк, в примере 200. Контрольные точки позволяют уменьшить
объем журнальных данных и предотвратить возможную нехватку места в пространстве отката.
ALTER TABLE ALL_ORACLE.ADMIN_LOG DROP UNUSED COLUMNS CHECKPOINT 200;
7.DDL. Добавление ограничений. Использование различных опций. Удаление ограничений.
Временное отключение. Каскадные ограничения.
Добавление ограничений
-позволяет добавлять или удалять ограничения и не позволяет изменять их структуру.
-включение или отключение этого ограничения.
Для добавления ограничения на данные в таблице используется синтаксис:
ALTER TABLE
<имя_таблицы>
ADD CONSTRAINT
<имя_ограничения>;
Временное отключение
Кроме того, можно разрешать или запрещать ограничения:
ALTER TABLE
<имя_таблицы>
ENABLE CONSTRAINT
<имя_ограничения>;
ALTER TABLE
<имя_таблицы>
DISABLE CONSTRAINT
<имя_ограничения>;
Проверочные ограничения. Использование различных опций.
Далее будут описаны различные типы ограничений:
ALTER TABLE
<имя_таблицы>
ADD CONSTRAINT
<имя_проверочного_ограничения>
CHECK
(<имя_проверяемой_колонки> IN
(
'значение_ограничения_1',
'значение_ограничения_2',
'значение_ограничения_3',
'значение_ограничения_4'
)
) DISABLE|ENABLE;
Добавление внешнего ключа:
ALTER TABLE
CUST_TABLE
ADD CONSTRAINT
FK_CUST_NAME FOREIGN KEY (PERSON_NAME)
REFERENCES
PERSON_TABLE (PERSON_NAME)
INITIALLY DEFERRED DEFERRABLE;
Добавление составного внешнего ключа:
ALTER TABLE
CUST_TABLE
ADD CONSTRAINT
FK_CUST_NAME FOREIGN KEY (PERSON_NAME, PERSON_GENDER)
REFERENCES
PERSON_TABLE (PERSON_NAME, PERSON_GENDER)
INITIALLY DEFERRED DEFERRABLE;
Удаление ограничений
Для удаления ограничения используется синтаксис:
ALTER TABLE
<имя_таблицы>
DROP CONSTRAINT
<имя_ограничения>;
Каскадные ограничения
-позволяет удалять все зависимые записи, в случае удаления записи из главной таблицы.
On delete cascade
8. Индексы. Автоматическое и ручное создание. Создание индекса для первичного ключа.
Индексы, основанные на функциях.
Индексы.
-уменьшают количество операций ввода/вывода, используют более короткий путь доступа к
данным. Индексы не зависят от таблиц и могут в любое время добавляться, изменяться или удаляться из
таблицы, но если удаляется вся таблица, то и индекс удаляется вместе с ним. Используется и обслуживается
сервером ORACLE автоматически.
Автоматическое создание индексов.
-на основе PK и ограничений unit(unique), при этом имя индекса будет совпадать с именем
ограничения.
Ручное создание индексов.
В случае ручного создания индексов, пользователь может создать любое количество
неуникальных записей. Индексы - для повышения доступа к строкам.
Create index index_name
On table_name(columns);
Правила создания индекса:
Поле содержит большое число различных значений.
Поле содержит много нулевых значений.
Одно или несколько полей используются в условиях отбора WHERE и при соединение
таблиц с помощью JOIN’а.
Таблица имеет большое число записей, а результат содержит от 2х до 4х %% записей.
Не рекомендуется:
Если индексируемое поле редко используется в проверке условий
Таблица имеет мало записей, или в выборку попала более 4х % записей.
Если данные в таблице часто изменяются.
Если индексируемые поля используются как часть выражения.
Индексы, основанные на функциях.
-индексы основанные на выражениях использующие имена полей, констант, встроенной
функции SQL, функций созданных пользователем.
Create index upper_dept_name_idx
On dept2 (dep_name))
Qherm_rewrite_enable –индексы основанные на функциях.
9.DDL.Удаление таблиц и использование мусорной корзины.
Удаление таблиц
Чтобы удалить таблицу необходимо иметь системную привилегию DROP ANY TABLE, или эта
таблица должна находиться в вашей схеме.
Для удаления таблицы используется оператор DROP TABLE. В следующем примере удалим
таблицу ALL_ORACLE.ADMIN_LOG:
DROP TABLE ALL_ORACLE.ADMIN_LOG;
Если таблица содержит первичные или уникальные ключи, на которые ссылаются внешние ключи
других таблиц, и вы хотите удалить ограничение FOREIGN KEY, определенное на дочерних
таблицах, в конструкцию DROP TABLE следует включить предложение CASCADE.
DROP TABLE ALL_ORACLE.ADMIN_LOG CASCADE CONSTRAINTS;
В большинстве случаев лучше не удалять таблицу, а очистить ее, выполнив TRUNCATE.
Следует учитывать:
Вместе с таблицей будет удалено ее определение в словаре данных, а строки станут
недоступными
Будут удалены связанные с таблицей индексы и триггеры
Синонимы удаленной таблицы остануться, но при обращении к ним будет выдаваться
сообщение об ошибке
Все зависимые от таблицы представления и программные блоки PL/SQL остануться, но станут
недействительными, непригодными к использованию
Все экстенты выделенные для удаленной таблицы освобождаются и возвращаются табличному
пространству, после чего могут использоваться любыми другими объектами. Из блоков кластера
удаляются все строки кластеризованной таблицы
Начиная с версии Oracle Database 10g объекты могут не удаляться сразу, а помещаться в корзину.
Одно из нововведений Oracle 10g это корзина. Эта возможность работает аналогично корзине в
OC Windows или Mac OS.
Существует два представления корзины: USER_RECYCLEBIN и DBA_RECYCLEBIN. Для удобства
синоним RECYCLEBIN указывает на ваш USER_RECYCLEBIN. По умолчанию корзина активирована,
но ее можно отключить в инициализационном параметре RECYCLEBIN, на уровне сессии или
системы.
Когда корзина активна, любые таблицы, которые вы удаляете, не удаляются полностью, а
попадают в корзину. Вместо того что бы удалить таблицу, Oracle переименовывает ее и все
связанные объекты (индексы, триггеры, LOB сегменты и т.д.). Дает им системное имя, которое
начинается на BIN$.
Если параметр RECYCLEBIN выставлен в значением ON, (по-умолчанию в Oracle 10g он включен),
удаление таблицы приведет к ее перемещению в корзину.
SQL>DROP TABLE TEST;
TABLE dropped.
SQL> SELECT OBJECT_NAME, ORIGINAL_NAME, TYPE,
2 CAN_UNDROP AS "UND", CAN_PURGE AS "PUR", DROPTIME
3 FROM RECYCLEBIN;
SQL>
OBJECT_NAME
ORIGINAL_NAME TYPE UND PUR DROPTIME
------------------------------ ------------- ----- --- ---- --------------BIN$HGnc55/7rRPgQPeM/qQoRw==$0 TEST
TABLE YES YES 2008-09-24:15:45:22
Таким образом видим, что таблица переименована, все данные которые в ней содержались, по
прежнему находятся в ней. Для Oracle это по прежнему, обычная таблица.
SQL> ALTER SESSION SET NLS_DATE_FORMAT='HH24:MI:SS';
Session altered.
SQL> SELECT * FROM "BIN$HGnc55/7rRPgQPeM/qQoRw==$0";
COL
CHANGE_DATE
Поскольку данные все на месте, то не составит труда вернуть из корзины таблицу обратно. Эта
операция известна как «flashback drop». Команда FLASHBACK TABLE... TO BEFORE DROP
переименовывает таблицу из имени с BIN$ в ее оригинальное имя, в нашем случае TEST.
SQL> FLASHBACK TABLE TEST TO BEFORE DROP;
Flashback complete.
SQL> SELECT * FROM TEST;
COL
CHANGE_DATE
SQL> SELECT * FROM RECYCLEBIN;
no rows selected
Следует помнить, что после удаления таблицы она только переименовывается, но не удаляется
физически. Сегменты таблицы, по прежнему, находятся в табличном пространстве, и занимают
место. Вы можете удалить объект из корзины восстановив его или удалив из корзины.
SQL>DROP TABLE TEST;
TABLE dropped.
SQL> SELECT OBJECT_NAME, ORIGINAL_NAME, TYPE,
2 CAN_UNDROP AS "UND", CAN_PURGE AS "PUR", DROPTIME
3 FROM RECYCLEBIN;
SQL>
OBJECT_NAME
ORIGINAL_NAME TYPE UND PUR DROPTIME
------------------------------ ------------- ----- --- ---- --------------BIN$HGnc55/7rRPgQPeM/qQoRw==$0 TEST
TABLE YES YES 2008-09-24:16:05:54
SQL> PURGE TABLE "BIN$HGnc55/7rRPgQPeM/qQoRw==$0";
TABLE purged.
SQL> SELECT * FROM RECYCLEBIN;
no rows selected
Есть несколько опций удаления. Можно удалить все из USER_RECYCLEBIN используя PURGE
RECYCLEBIN; пользователь с привилегиями DBA может удалить все из всех корзин, используя
DBA_RECYCLEBIN; и наконец, можно очистить корзину по схеме и пользователю, используя PURGE
TABLESPACE USER.
Oracle сохраняет объекты в таблице до тех пор пока вы не удалили их, или в табличном
пространстве хватает места, или не превышена квота пользователя. Очистка произойдет одной
операцией с текущего момента до тех пор, пока не освободится достаточно места для текущей
операции. Если файлы данных табличного пространства с опцией AUTOEXTEND ON, корзина будет
очищена до того как сработает автоприращение.
Удаление версий таблицы
Точно так же как в корзине Windows может быть несколько файлов с одинаковым именем и
расширением, в корзине Oracle может быть несколько версий таблицы.
SQL> FLASHBACK TABLE TEST TO BEFORE DROP;
Flashback complete.
Oracle всегда восстанавливает последнюю по времени версию объекта. Чтобы восстановить более
раннюю версию можно указать имя таблицы для восстановления. Сейчас в корзине две версии:
Зависимые объекты
В современных базах данных очень редки ситуации, когда таблица существует сама по себе. Как
правило, они имеют индексы, триггеры, связи ограничения. Удаление таблицы приводит к
удалению всех зависимых объектов. При удалении все объекты, как и таблица,
переименовываются, их новое имя начинается так же с BIN$.
Представление RECYCLEBIN имеет и другие столбцы, показывающие и связь между TEST и
TEST_COL_IDX.
SQL> ALTER SESSION SET NLS_DATE_FORMAT='HH24:MI:SS';
SQL> SELECT OBJECT_NAME, ORIGINAL_NAME, TYPE,
2 CAN_UNDROP AS "UND", CAN_PURGE AS "PUR", DROPTIME,
3 BASE_OBJECT, PURGE_OBJECT
4 FROM RECYCLEBIN
5 ORDER BY DROPTIME;
SQL>
OBJECT_NAME
ORIGINAL_NAME TYPE UND PUR DROPTIME BASE_OBJECT PURGE_OBJECT
---------------- ------------- ----- --- ---- --------- ----------- -----------BIN$HGnc55/8rRPg TEST
TABLE YES YES 16:10:54 233032
233032
TABLE YES YES 17:08:41 233031
233031
QPeM/qQoRw==$0
BIN$HGnc55//rRPg TEST
QPeM/qQoRw==$0
BIN$HGnc55/+rRPg TEST_COL_IDX INDEX NO YES 17:08:41 233031
233434
QPeM/qQoRw==$0
Колонка PURGE_OBJECT содержит номер самого объекта, BASE_OBJECT содержит номер главного
объекта. Таблица TEST имеет номер 233031, базовый объект для нее – тот же самый, т.е. она сама
себе базовый объект. Индекс TEST_COL_IDX имеет номер 233434, а базовый объект для него –
233031, таблица TEST.
Если выполнить FLASHBACK TABLE для таблицы TEST, ее индекс будет восстановлен, но Oracle не
переименует его обратно в оригинальное имя. У индекса так и останется имя BIB$.
SQL> FLASHBACK TABLE TEST TO BEFORE DROP;
Flashback complete.
SQL> SELECT * FROM TEST;
COL
CHANGE_DATE
--------------------------------------Версия 3
16:59:21
SQL> SELECT * INDEX_NAME FROM USER_INDEXES WHERE TABLE_NAME='TEST';
INDEX_NAME
-----------------------------BIN$HGnc55/+rRPgQPeM/qQoRw==$0
Скорее всего, Oracle не особо заботится о сохранении оригинального имени индекса. Если сейчас
снова удалить копию таблицы TEST, то выяснится, что Oracle «не помнит» оригинального имени
индекса.
SQL>DROP TABLE TEST;
TABLE dropped.
SQL> SELECT OBJECT_NAME, ORIGINAL_NAME, TYPE,
2 CAN_UNDROP AS "UND", CAN_PURGE AS "PUR",
3 DROPTIME, BASE_OBJECT, PURGE_OBJECT
4 FROM RECYCLEBIN
5 ORDER BY DROPTIME;
SQL>
OBJECT_NAME ORIGINAL_NAME TYPE UND PUR DROPTIME BASE_OBJECT PURGE_OBJECT
---------------- --------------- ----- --- ---- --------- ----------- -----------BIN$HGnc55/8rRPg TEST
TABLE YES YES 16:10:54 233032 233032
QPeM/qQoRw==$0
BIN$HGnc55//rRPg TEST
TABLE YES YES 17:08:41 233031 233031
QPeM/qQoRw==$0
BIN$HGnc56AArRPg BIN$HGnc55/+rRP INDEX NO YES 17:08:41 233031 233434
QPeM/qQoRw==$1
gQPeM/qQoRw==$0
Обратите внимание на значения в столбцах CAN_UNDROP и CAN_PURGE (мы их показываем как
UND и PUR) для индекса. Индекс не может быть восстановлен без таблицы, значение
CAN_UNDROP равно NO. В то же время индекс может быть удален без таблицы.
SQL> PURGE INDEX "BIN$HGnc56AArRPgQPeM/qQoRw==$1";
Index purged.
SQL> SELECT OBJECT_NAME, ORIGINAL_NAME, TYPE,
2 CAN_UNDROP AS "UND", CAN_PURGE AS "PUR",
3 DROPTIME, BASE_OBJECT, PURGE_OBJECT
4 FROM RECYCLEBIN
5 ORDER BY DROPTIME;
SQL>
OBJECT_NAME ORIGINAL_NAME TYPE UND PUR DROPTIME BASE_OBJECT PURGE_OBJECT
---------------- --------------- ----- --- ---- --------- ----------- -----------BIN$HGnc55/8rRPg TEST
TABLE YES YES 16:10:54 233032 233032
QPeM/qQoRw==$0
BIN$HGnc55//rRPg TEST
TABLE YES YES 17:08:41 233031 233031
QPeM/qQoRw==$0
Сейчас если восстановить таблицу, то она будет восстановлена без индекса
SQL> FLASHBACK TABLE TEST TO BEFORE DROP;
Flashback complete.
SQL> SELECT * FROM TEST;
COL
CHANGE_DATE
-------------
---------------------------
Версия 3
16:59:21
SQL> SELECT * INDEX_NAME FROM USER_INDEXES WHERE TABLE_NAME='TEST';
no rows selected
Если удалите таблицу со связанными LOB сегментами, то с ними будет подобная ситуация,
исключение состоит в том, что они не могут быть независимо удалены, CAN_UNDROP и
CAN_PURGE будут выставлены в NO. Если восстановить таблицу то они будут восстановлены
вместе с ней, если таблица будет удалена из корзины, то и они будут удалены.
Ограничения
Если удаляется таблица и затем восстанавливается, ссылочная целостность теряется.
Для материализованных представлений, если удаляется таблица, все журналы определенные
для этой таблицы удаляются без помещения в корзину.
Если удаляется базовая таблица, то bitmap индексы не помещаются в корзину. При
восстановлении таблицы из корзины индексы не восстанавливаются.
Отключение корзины
Аналогично корзине в Windows, где можно удалить файл, минуя корзину, в Oracle реализован
такой же механизм. Для этого в предложении DROP TABLE указывается PURGE.
SQL> PURGE RECYCLEBIN;
Recyclebin purged.
SQL> SELECT * FROM RECYCLEBIN;
no rows selected
SQL> CREATE TABLE NEW_TABLE (COL1 VARCHAR2(10), COL2 VARCHAR2(10));
TABLE created.
SQL> DROP TABLE NEW_TABLE PURGE;
TABLE dropped.
SQL> SELECT * FROM RECYCLEBIN;
no rows selected
Если отключать корзину на уровне сессии, то требуется выполнить предложение ALTER SESSION
SET RECYCLEBIN=OFF. Это даст тот же эффект, что и добавление PURGE в предложение DROP
TABLE. Но, стоит отметить, что можно использовать FLASHBACK DROP для восстановления
объектов, которые были помещены в корзину до того как было выполнено отключение корзины.
Выводы
Корзина может содержать несколько версий одного объекта.
Oracle восстанавливает объекты по алгоритму LIFO, можно восстановить старейшую версию, с
указанием прямого имени объекта.
Oracle при удалении основного объекта удаляет и зависимые объекты, при восстановлении
зависимые объекты восстанавливаются (за исключением ограничений указанных выше). Для
индексов при восстановлении не восстанавливается оригинальное имя.
При отключении корзины, возможность восстановить объекты из нее остается, это касается
объектов помещенных в корзину до ее отключения.
10.Подзапросы. Использование в качестве: источника данных при копировании, объекта
назначения добавляемых записей (в т.ч. WITH CHECK OPTION), источника данных в запросе с
соединениями, нового значения для изменяемого поля, значения для сравнения в разделе
проверки условия (при изменении и удалении записи).
Подзапросы.
Правила использования подзапросов.
1.Подзапросы всегда заключаются в круглые скобки.
2. В целях сравнения подзапроса его размещают справа.
3.Если выполняется условие TOP_N, то условие в условие используется order by.
4.Раздел order by не всегда допускается при использовании подзапросов.
5.В однострочных операторах используется однострочные подзапросы.
6.Многострочные используются с многострочными.
Пример:
Select last_name,first_name, …
From emps
Where job_id= (
Select job_id
FROM emps
WHERE employee_id=143
)
Пример использования подзапросов в качестве источника данных при копировании:
INSERT INTO sals_reps (id,name,salary,cms_pct)
(
SELECT employee_id,lst_name,salary,commission_pct
FROM emps
WHERE job_id LIKE ‘%SA_REP%’;
)
Пример использования подзапросов в качестве объекта назначения добавляемых
данных.
SELECT
-Пример использования подзапросов в качестве источника данных в запросе с
соединениями.
SELECT e1.employee_id,
e1.lst_name,e1.salary,e1.commission_pct,
D.department_name
FROM
(
Select employee_id, last_name, first_name,
department_id
FROM emps
Where manager_id =102
) e1
JOIN departments D
On e1.department_id=d.department_id;
--
11. Ручное использование опции DEFAULT. Множественное добавление записей в несколько
таблиц. Разновидности, особенности. Pivoting insert.
Ручное использование опции DEFAULT
Установки по умолчанию. Тип данных по умолчанию- тип содержания записей.
Пример:
CREATE TABLE dept
(
Deptno number (2),
Dname varchar2(14),
Loc varchar2 (13),
Create_date date default sysdate
)
Множественное добавление записей в несколько таблиц.
Разновидности, особенности. Pivoting insert.
12.Команда MERGE
В Oracle 9 появилась новая команда DML - Merge, которая позволяет сливать данные
одной таблицы с данными другой таблицы.
Пример
MERGE INTO destination_table dest
USING (SELECT col1, col2, col3 FROM source_table) source1
ON (dest.col1 = source1.col1)
WHEN MATCHED THEN
UPDATE SET dest.col2 = source1.col2,
dest.col3 = source1.col3
WHERE source1.col2 IS NOT NULL
DELETE source1.col2 IS NULL
WHEN NOT MATCHED THEN
INSERT (dest.col1, dest.col2, dest.col3)
VALUES (source1.col1, source1.col2, source1.col3)
WHERE source1.col2 IS NOT NULL
Это простое слияние таблиц destination_table и source_table, проверяется условие dest.col1
= source1.col1, и если оно истинно, то выполняется Update, если нет - Insert. Причем нельзя
изменять поля таблицы destination_table в секции Update, по которым идет связывание двух
таблиц.
На все операции удаления, вставки или обновления, указанные применительно к целевой
таблице инструкции MERGE, распространяются все ограничения, определенные для этой таблицы,
включая все каскадные ограничения ссылочной целостности. Если IGNORE_DUP_KEY имеет
значение ON для всех уникальных индексов в целевой таблице, то в инструкции MERGE этот
параметр не учитывается.
13.Выборка с группировкой. Операторы Rollup,CUBE . Композиция полей.
Rollup и CUBE в сочетании с GROUP BY позволяют выполнять промежуточные итоги для
полученных подгрупп.
Rollup – вычисляет итоговое значение для каждой подфункции.
CUBE – вычисляет значения полученные после rollup, а также дополнительные записи,
полученных пересечением группируемых значений.
Пересечения - записи, основанные на значениях всех возможных комбинационных
значений выражений, указанных в операторах групп.
Просто включая функцию ROLLUP во фразе GROUP BY, мы указываем Oracle, чтобы он
просуммировал данные по уровнях указанных выше столбцов и подвел общий итог. Обратите
внимание, что когда Oracle сообщает общий итог, то остается незаполненной строка в столбце, по
которому строилась фраза GROUP BY. Если столбец GROUP BY также содержит пустые значения, то
может быть трудно отличить его значения от итога по строке.
Если в разделе group by имеется n-полей, то в результате получается 2^n вариантов
группировок.
select deptno, count(*), grouping(deptno)
from emp
group by rollup(deptno);
Просто ROLLUP является и CUBE-функцией. CUBE группирует данные по нескольким измерениям. В
частности, она суммирует данные, которые явно наличествуют в столбцах, специфицированных в
фразе GROUP BY. Посмотрим, как она работает:
select deptno, job, count(*), grouping(deptno), grouping(job)
from emp
group by cube(deptno, job);
Композиция полей.
-набор полей, обрабатываемый как единый блок.
-для обозначения блока в roll up и cube соответствующими выражениями выделяются
скобками.
-если встретится композиция полей, то при выполнение roll up и CUBE соответствующий
уровень группировки пропускается.
Select dep_id,job_id,man_id
FROM emps
GROUP BY ROLLUP(dep_id,(job_id,manager_id))
14. Выборка с группировкой. Функция GROUPING.
Функция GROUPING.
-используется в сочетании с Rollup и CUBE.
-используется для определения группировки, на основе которой получена
соответствующая запись.
-используется для различия нулевых значений присутствующих в исходных данных,
полученных от оператора ROLLUP.
-возвращает единицу или нуль.
Единица – выражение не используется для вычислений (итоговое поле),
Нуль-выражение используется для вычислений (поле участвует в вычисление).
Select dep_id,job_id,sum(salary),grouping
(dep_id),grouping(job_id)
From emp
Where dep_id<50
Group by rollup (dep_id,job_id)
15. Выборка с группировкой. Набор группировок. Соединение нескольких наборов.
GROUPING SETS
-расширение group by, указаны несколько вариантов в одном запросе, позволит вычислить
разнообразные итоговые значения в разных измерениях.
-оператор эквивалентен отдельным групповым запросам SELECT с соответствующей
комбинацией группировок объединенных между собой оператором UNION ALL.
-эффективность оператора , требуется только однократный запрос участвующий в выборке.
-чем больше групп в операторах, тем выше производительность.
SELECT *
FROM TABLE
GROUP BY GROUPING SETS ((A,B,C),(A,B),B)
Соединение группировки.
-перечисляется последовательность group by ч/з запятую, могут использоваться с
помощью ROLLUP,GROUPING и SETS, в качестве результата выступает декартовое соединение
группировок каждого значения.
Select dep_id, job_id, manager_id, sum(salary)
From emps
Group by dep_id,
Rollup (job_id),
CUBE(manager_id)
16. Часовые пояса. Параметр TIME_ZONE.Определение временных параметров системы и сессии.
Данные типа TIMESTAMP.
Download