Сервер гарантирует, что любая команда получает целостный образ данных фиксированный на какой-то момент времени, даже если в текущий момент данные изменяются другими транзакциями. Когда сервер начинает выполнение команды выборки, undo-сегмента он определяет текущий номер изменений (SCN) и не позволяет данной команде получить доступ к информации, которая не была зафиксирована до этого SCN.
Undo-сегмент system
Создается в табличном пространстве SYSTEM во время создания базы данных. Этот undo-сегмент используется только для изменений, касающихся объектов табличного пространства SYSTEM.
Табличное пространство типа undo
· Табличное пространство типа UNDO может быть создано в момент создания базы данных при помощи команды
CREATE DATABASE db01
UNDO TABLESPACE und01 DATAFILE 'undoldb01.dbf' SIZE 20M AUTOEXTEND ON;
· Или может быть создано позднее по команде
CREATE UNDO TABLESPACE undol DATAFILE 'undoldb0l.dbf' SIZE 20M;
Изменение табличного пространства типа UNDO
Команда alter tablespace позволяет произвести изменения в табличном пространстве undo:
· ADD DATAFILE
· RENAME
· DATAFILE [ONLINE | OFFLINE]
· BEGIN BACKUP
· END BACKUP
Пример:
Файл данных добавляется к табличному пространству undo :
ALTER TABLESPACE undotbs
ADD DATAFILE 'undotbs2.dbf' SIZE 30M
AUTOEXTEND ON;
Переключение табличных пространств типа undo
· Вы можете переключить использование табличного пространства UNDO с одного на другое.
· Только одно табличное пространство undo может быть назначено экземпляру в какой-то момент времени.
· Более одного табличного пространства undo может быть создано для экземпляра, но только одно может быть активным.
· Переключение выполняется динамически по команде alter system
ALTER SYSTEM SET UNDO_TABLESPACE=UNDOTBS2;
Удаление табличного пространства типа undo
Команда drop tablespace используется для удаления табличного пространства undo
DROP TABLESPACE UNDOTBS2;
- переключитесь на новое табличное пространство UNDO ;
- удалите табличное пространство после завершения текущих транзакций.
Квоты на использование текущего табличного пространства undo
· Длинные транзакции - результат неверного программирования, потребляющие значительные ресурсы.
· Квоты на табличное пространство UNDO задают максимальные ресурсные ограничения для группы пользователей.
· UNDO_POOL - директива Resource Manager, определяющая размер пространства для группы потребителей ресурсов.
· Когда группа превышает лимит, новые транзакции для группы невозможны, пока текущая транзакция не закончится нормально или аварийно и не освободит пространство отката.
Получение информации об Undo-сегментах
-Представления словаря данных
DBA_ROLLBACK_SEGS
-Динамические представления производительности
V$ROLLNAME, V$SESSION,
V$TRANSACTION, V$ROLLSTAT, V$UNDOSTAT
27. Триггеры БД.
1.Триггер проверяет возможность удаления записи из таблицы «Клиент». Если в таблице «Заказы» существуют связанные записи, то выдается сообщение об ошибке. В противном случае запись удаляется.
SQL> edit trigdelete;
\\Текст триггера:
CREATE OR REPLACE TRIGGER trigdelete
BEFORE DELETE
ON client
REFERENCING OLD as old_row
FOR EACH ROW
DECLARE
A number;
BEGIN
SELECT count(clientid) INTO A
FROM orders
WHERE clientid=:old_row.clientid;
if (A > 0) THEN
raise_application_error(-20001, 'Neobxodimo udalit svyazannie zapisi iz tablici zakazi!');
END IF;
END;
/
SQL> SET SERVEROUTPUT ON;
SQL> @trigdelete
Триггер создан.
SQL> delete from client
2 where clientid=3;
delete from client
*
ошибка в строке 1:
ORA-20001: Neobxodimo udalit svyazannie zapisi iz tablici zakazi!
ORA-06512: на "SCOTT.TRIGDELETE", line 10
ORA-04088: ошибка во время выполнения триггера 'SCOTT.TRIGDELETE'
SQL> delete from client
2 where clientid=2;
1 строка удалена.
SQL> select * from client;
CLIENTID FIO CL_PHONE EMAIL
---------- -------------------- ----------- --------------1 Komarov AV 4563214 kav@mail.ru
3 Ivanova IM 3216589 iim@mail.ru
4 Smirnova SO 9854786 ssov@mail.ru
2. Триггер проверяет возможность вставки данных в таблицу «Заказы». Если параметры новой записи соответствуют кодам клиента, спектакля и театра в соответствующих таблицах «Клиент», «Спектакль» и «Театр», то запись успешно вставляется. Если какая-либо из записей не соответствует значению первичного ключа, выдается ошибка.
SQL> edit triginsert;
\\Текст триггера:
CREATE OR REPLACE TRIGGER triginsert
BEFORE INSERT
ON Orders
REFERENCING NEW as new_row
FOR EACH ROW
DECLARE
CountPlay NUMBER;
CountClient NUMBER;
CountTheatre NUMBER;
BEGIN
SELECT count(playid)
INTO CountPlay
FROM play
WHERE playid=:new_row.playid;
SELECT count(clientid)
INTO CountClient
FROM client
WHERE clientid=:new_row.clientid;
SELECT count(theatreid)
INTO CountTheatre
FROM theatre
WHERE theatreid=:new_row.theatreid;
IF (CountPlay = 0) THEN
raise_application_error(-20001,'Spektaklya s takim kodom ne sushestvuet!!!');
END IF;
IF(CountClient = 0) then
raise_application_error(-20001,'Klienta s takim kodom ne sushestvuet!!!');
END IF;
IF(CountTheatre = 0) then
raise_application_error(-20001,'Teatra s takim kodom ne sushestvuet!!!');
END IF;
END;
/
SQL> SET SERVEROUTPUT ON;
SQL> @triginsert
Триггер создан.
SQL> insert into orders
2 values (4, 2, 1, 3, '13-05-2009', '17-05-2009', '17-05-2009');
insert into orders
*
ошибка в строке 1:
ORA-20001: Klienta s takim kodom ne sushestvuet!!!
ORA-06512: на "SCOTT.TRIGINSERT", line 22
ORA-04088: ошибка во время выполнения триггера 'SCOTT.TRIGINSERT'
SQL> insert into orders
2 values (4, 1, 10, 3, '13-05-2009', '17-05-2009', '17-05-2009');
insert into orders
*
ошибка в строке 1:
ORA-20001: Spektaklya s takim kodom ne sushestvuet!!!
ORA-06512: на "SCOTT.TRIGINSERT", line 19
ORA-04088: ошибка во время выполнения триггера 'SCOTT.TRIGINSERT'
SQL> insert into orders
2 values (4, 1, 1, 5, '13-05-2009', '17-05-2009', '17-05-2009');
insert into orders
*
ошибка в строке 1:
ORA-20001: Teatra s takim kodom ne sushestvuet!!!
ORA-06512: на "SCOTT.TRIGINSERT", line 25
ORA-04088: ошибка во время выполнения триггера 'SCOTT.TRIGINSERT'
SQL> insert into orders
2 values (4, 3, 3, 1, '13-05-2009', '17-05-2009', '17-05-2009');
1 строка создана.
4. Триггер проверяет, чтобы дата заказа билетов не превышала даты
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.