Модификация таблицы (ALTER TABLE)
Функция
Определение оператора изменения структуры и/или атрибутов базовой таблицы.
Спецификация
::=::=::=добавление первичного ключа
|добавление уникального ключа
|добавление внешнего ключа
|добавление CHECK-условия таблицы
|удаление первичного ключа
|удаление уникального ключа
|удаление внешнего ключа
|удаление CHECK-условий таблицы
|установка режима циклической таблицы
|отмена режима циклической таблицы
}
::=::=::=::=::=::=::=::=::=::=::=::=::=::=::=::=[MATCH {SIMPLE | FULL | PARTIAL}]
[спецификация действий]
::=::=Общие правила
-
Для выполнения команды необходимы уровень доступа RESOURCE к БД и привилегия доступа ALTER к изменяемой таблице.
Синтаксические правила переименования таблицы
-
При переименовании таблицы нельзя изменить ее схему.
Общие правила переименования таблицы
-
Переименование системных таблиц не допускается.
-
Операция переименования таблицы не проверяет возможное использование заменяемого имени таблицы в других объектах БД (представлениях, синонимах, хранимых процедурах), поэтому, если такие объекты существуют, они перестанут работать.
Примеры
alter table tab rename to "Заказы"; alter table user1.sale rename to "Продажи";
Синтаксические правила добавления первичного ключа
-
Запрещено добавление атрибута
PRIMARY KEYдля псевдостолбцов (типаROWID,ROWTIME). -
Запрещено создание
PRIMARY KEYна ту же комбинацию столбцов, на которую уже есть уникальный ключ (UNIQUE) с тем же порядком столбцов (верно как для простых, так и для составных ключей). -
Комбинации атрибутов
PRIMARY KEYиNULLнедопустима. -
Для столбцов типа
DATE,BOOLEAN,BLOB,EXTFILEатрибутPRIMARY KEYнедопустим.
Общие правила добавления первичного ключа
-
Изменение первичного ключа с помощью его переопределения не допускается. В этом случае необходимо сначала его удалить (см. конструкцию <удаление первичного ключа>), а потом создать заново.
create or replace table tst (i smallint primary key); alter table tst add column c char(10); alter table tst add primary key (i,c); // ошибка alter table tst drop primary key; alter table tst add primary key (i,c); // нормальное завершение
Примеры
create or replace table tst (i smallint); alter table tst add primary key (i); create or replace table tst (i smallint, ch char(10)); alter table tst add primary key (i,ch);
Синтаксические правила добавления уникального ключа
-
Запрещено добавление атрибута
UNIQUEдля псевдостолбцов (типаROWID,ROWTIME). -
Запрещено создание уникального ключа на ту же комбинацию столбцов, на которую уже есть первичный ключ (
PRIMARY KEY) или уникальный ключ с тем же порядком столбцов. Привило распространяется для простых и для составных ключей. -
Для столбцов типа
DATE,BOOLEAN,BLOB,EXTFILEатрибутUNIQUEнедопустим.
Общие правила добавления уникального ключа
-
Конструкция
UNIQUE (VALUE)создаёт уникальный ключ из всех столбцов таблицы (за исключением псевдостолбцов).// создание уникального ключа из столбцов i, ch, d create or replace table tst (i smallint, ch char(10), d float); alter table tst add unique (value);
-
Конструкция
UNIQUE (VALUE)создаёт уникальный ключ только из тех столбцов, которые существуют в таблице на текущий момент. Если в таблицу будут добавлены новые столбцы, они автоматически не войдут в составной уникальный ключ – надо будет повторить операциюUNIQUE (VALUE). -
Опция
INDEXFILE<номер файла>задает номер индексного файла, в котором должен храниться индекс добавляемого столбца. Если опция не задана, то для таблиц, имеющих более одного индексного файла, по умолчанию используется значение2.create or replace table tst (i int unique, j int) indexfiles 3; create or replace index i on tst indexfile 2; alter table tst add unique(j) indexfile 3;
-
Опция
BY APPENDзадает режим создания индекса не через сортировку данных (как делается по умолчанию), а через последовательное добавление элементов.create or replace table tst (i int unique, j int) indexfiles 3; alter table tst add unique(j) by append;
Примеры
create or replace table tst (i smallint, ch char(10)); alter table tst add unique (ch); create or replace table tst (i smallint, ch char(10)); alter table tst add unique (i, ch);
Синтаксические правила добавления внешнего ключа
-
Описание опции
MATCHи конструкции<спецификация действий>приведено в пункте «Создание таблицы. Внешний ключ». -
Если
<список столбцов>ссылается на первичный ключ таблицы, то этот<список столбцов>можно не указывать.create or replace table tab1 (i1 int); create or replace table tab2 (i2 int primary key); alter table tab1 add foreign key (i1) references tab2;
эквивалентная конструкция:
alter table tab1 add foreign key (i1) references tab2(i2);
Общие правила добавления внешнего ключа
-
В таблицу можно добавить несколько внешних ключей.
create or replace table tab1 (i1 int, c1 char(10)); create or replace table tab2 (i2 int primary key, c2 char(10) unique); alter table tab1 add foreign key (i1) references tab2; alter table tab1 add foreign key (c1) references tab2(c2);
Примеры
alter table ref_sub1a add foreign key (id_ref) references ref_main(id) on delete no action; alter table ref_sub1a_1b add foreign key (id_ref1) references ref_sub1a(id) on delete cascade; alter table ref_sub1a_1b add foreign key (id_ref2) references ref_sub1b(id) on delete set null;
Синтаксические правила добавления CHECK-условия таблицы
-
Использование столбцов с атрибутом AUTOROWID, псевдостолбцов ROWID, ROWTIME и DBROWTIME и предиката [NOT] CONTAINS (см. документ «Полнотекстовый поиск в базе данных», пункт «Предикат полнотекстового поиска») в
<логическом выражении>запрещено. -
В
<логическом выражении>разрешено использование псевдозначенийSYSDATE,NOW,LOCALTIME,LOCALTIMESTAMP,CURRENT_DATE,CURRENT_TIME,CURRENT_TIMESTAMP. Однако при этом в БД могут оказаться записи, которые удовлетворяли ограничениюCHECKв момент выполнения операцииINSERT/UPDATE, но со временем перестали удовлетворять этому ограничению, т.к. текущее значение этих псевдозначений стало другим.create or replace table tst(i int); alter table tst add check (i<datesplit(sysdate, 'Y')-2000); insert into tst values(5); insert into tst values(15); insert into tst values(250); // ошибка
-
Таблица может иметь произвольное число ограничений целостности типа
CHECK, но суммарная длина всех оттранслированных CHECK-условий не должна превышать 4 Кбайт.create or replace table tst(i int, ch char(10), d float); alter table tst add check (i<(datesplit(sysdate, 'Y')-2000)); alter table tst add check (to_number(ch) > i); alter table tst add check (i+d > 100.78);
или эквивалентная конструкция
alter table tst add check (i<(datesplit(sysdate, 'Y')-2000) and to_number(ch) > i and (i+d > 100.78));
-
Ограничение целостности
CHECKдля таблицы может содержать ссылки на любые столбцы этой же таблицы. -
Ограничение целостности типа
CHECKне может содержать подзапросов, агрегатных функций, конструкцийCASEиCAST, функцийSECURITY,INDEXTIME,LINIDXINFO,LEAD,LAG,GREATEST,LEAST,RANK,GETTEXTPOS,GET_EVENTS_STATE.
Общие правила добавления CHECK-условия таблицы
-
Ограничения целостности типа
CHECKдля таблицы проверяются в том же порядке, в каком они создавались. -
Добавленное CHECK-условие присоединяется по логическому «И» ко всем ранее заданным условиям
CHECK. -
При выполнении операции
DELETECHECK-условия не проверяются.
Общие правила изменения уровня мандатного контроля доступа таблицы
-
<Идентификатор>задает имя соответствующего уровня доступа (на чтение данных из таблицы (RAL) или на добавление/корректировку данных (WAL)). Допускается назначать только существующие в БД уровни доступа. -
Указание мандатного доступа запрещено для системных таблиц.
-
Более подробно работа с уровнями мандатного контроля доступа описана в документе «Администрирование комплекса средств защиты данных», пункт «Управление уровнем доступа к таблице».
-
Отменить (изменить) мандатный уровень доступа к таблице невозможно (например, нельзя хранящиеся в БД секретные данные объявить несекретными).
Примеры
create or replace table RT (ID INT AUTOINC PRIMARY KEY,IDR INT, NNAME CHAR(25)); create level LEVEL3=3; ALTER table RT SET LEVEL(LEVEL3,LEVEL3); ALTER table RT SET COLUMN ID LEVEL(LEVEL3,LEVEL3);
Синтаксические правила удаления первичного ключа
-
Опция
WITHOUT INDEXзадает режим отмены атрибута столбца без удаления построенного по этому столбцу индекса (например, был создан столбец, для него создан индекс, потом столбец был объявлен какPRIMARY KEY, а затем этот атрибут столбца отменяется с данной опцией – индекс останется). -
По умолчанию (опция
WITHOUT INDEXне задана) индекс удаляется.
Общие правила удаления первичного ключа
-
Таблица, к которой применяется конструкция
<удаление первичного ключа>, должна иметь первичный ключ. -
Удалить первичный ключ можно только в том случае, если на него нет внешних ссылок из других таблиц, иначе надо предварительно удалить все внешние ссылки на него (см. конструкцию <удаление внешнего ключа>).
Пример
Удаление первичного ключа, на который есть ссылки внешних ключей.
create or replace table tab1 (i int, c1 char(10), c2 varchar(15), primary key (i,c2)); create or replace table tab2 (i int, c2 varchar(20), foreign key(i,c2) references tab1); 1) Получить список таблиц, у которых есть внешние ключи, ссылающиеся на удаляемый первичный ключ (например, в таблице TAB1). Это можно сделать с помощью представления FOREIGN_KEYS (создается в демонстрационной БД) select fktable_name, fkcolumn_name from foreign_keys where pktable_name='TAB1'; FKTABLE_NAME FKCOLUMN_NAME TAB2 I TAB2 C2 2) Удалить внешний ключ alter table tab2 drop foreign key (i, c2); 3) Удалить первичный ключ alter table tab1 drop primary key;
Синтаксические правила удаления уникального ключа
-
Опция
WITHOUT INDEXзадает режим отмены атрибута столбца без удаления построенного по этому столбцу индекса (например, был создан столбец, для него создан индекс, потом столбец был объявлен как UNIQUE, а затем этот атрибут столбца отменяется с данной опцией – индекс останется). -
По умолчанию (опция
WITHOUT INDEXне задана) индекс удаляется.
Общие правила удаления уникального ключа
-
Таблица, к которой применяется конструкция
<удаление уникального ключа>, должна иметь соответствующий уникальный ключ.create or replace table tst (i int, ch char(10), unique (i, ch)); alter table tst drop unique (i, ch);
-
Если для удаления уникального ключа используется опция
VALUE, то удаляемый уникальный ключ тоже должен быть создан с помощью этой опции.
Примеры
1) create or replace table tst (i int, ch char(10), d float, unique (i, ch)); alter table tst drop unique (value); // ошибка 2) create or replace table tst (i int, ch char(10), d float); alter table tst add unique (value); alter table tst drop unique (value); // ОК
Синтаксические правила удаления внешнего ключа
-
Опция
WITHOUT INDEXзадает режим отмены атрибута столбца без удаления построенного по этому столбцу индекса (например, был создан столбец, для него создан индекс, потом столбец был объявлен какFOREIGN KEY(или вошел в состав внешнего ключа), затем этот атрибут столбца отменяется данной опцией – индекс останется). -
По умолчанию (опция
WITHOUT INDEXне задана) индекс удаляется.
Общие правила удаления внешнего ключа
-
Таблица, к которой применяется конструкция
<удаление внешнего ключа>, должна иметь соответствующий внешний ключ.create or replace table tab1 (i1 int, c1 char(10)); create or replace table tab2 (i2 int primary key, c2 char(10) unique); alter table tab1 add foreign key (i1) references tab2; alter table tab1 add foreign key (c1) references tab2(c2); alter table tab1 drop foreign key (c1);
Общие правила удаления CHECK-условий таблицы
-
Удаляются сразу все CHECK-условия таблицы. Выборочное удаление CHECK-условия не поддерживается.
-
CHECK-условия для столбцов остаются неизменными
Пример
alter table tst drop check;
Синтаксические правила установки режима циклической таблицы
-
Значение параметра
<количество записей>должно быть в интервале от 1 до 1073741823 (0x3FFFFFFF).
Общие правила установки режима циклической таблицы
-
Конструкция
SET RECORDS LIMITустанавливает режим циклической таблицы для указанной базовой таблицы. -
Параметр
<количество записей>задает максимальное количество записей в циклической таблице. В случае превышения указанного значения новые записи будут размещаться на месте самых старых.create or replace table ct(i int); insert into ct values(1),(2),(3), (4),(5); select * from ct; I 1 2 3 4 5 alter table ct set records limit 3; insert into ct values(10),(20),(30), (40),(50); select * from ct; I 40 50 30
-
Если на момент установки циклического режима таблица содержала большее количество записей, чем задано в параметре
<количество записей>, то все записи, номера (ROWID) которых превышают значение<количество записей>, будут удалены. При их удалении будут срабатывать, если созданы, триггеры «before delete .. for each row» и «after delete .. for each row».create or replace table ct(i int); insert into ct values(1),(2),(3), (4),(5); select * from ct; I 1 2 3 4 5 alter table ct set records limit 3; select * from ct; I 1 2 3
-
Для циклических таблиц поддерживаются все типы триггеров, кроме «instead of delete». Попытка преобразовать таблицу с имеющимися триггерами «instead of delete» в циклическую или создать такой триггер для уже существующей циклической таблицы будет неуспешной.
-
В случае автоматического удаления старых записей при добавлении новых записей в циклическую таблицу поддерживается следующий порядок срабатывания триггеров (если соответствующие триггеры созданы):
-
триггеры «before insert .. for each statement» для добавляемой записи;
-
триггеры «before delete .. for each row» для удаляемой записи;
-
триггеры «after delete .. for each row» для удаляемой записи;
-
триггеры «before insert .. for each row» для добавляемой записи;
-
триггеры «after insert .. for each row» для добавляемой записи;
-
триггеры «after insert .. for each statement» для добавляемой записи.
-
-
Особенности добавления новых записей в переполненную циклическую таблицу из подзапроса (INSERT FROM SELECT) см. в разделе «Добавление записи» (оператор INSERT).
-
Для системных таблиц циклический режим запрещен.
Общие правила отмены режима циклической таблицы
-
Конструкция
CANCEL RECORDS LIMITотменяет ранее установленный режим циклической таблицы. Манипулирование записями таблицы будет выполняться в соответствии с ранее установленными параметрамиMAXROWID,MAXROW.
Пример
alter table ct cancel records limit;
Общие правила модификации триггеров
-
Команду
REBUILD ALL TRIGGERSможет выполнить только владелец таблицы с уровнем прав не менееRESOURCE. -
Для повторной трансляции всех триггеров, настроенных на модифицированную таблицу, необходимо выполнить команду вида:
ALTER TABLE <имя таблицы> REBUILD ALL TRIGGERS;
-
При выполнении команды
REBUILD ALL TRIGGERSтриггеры перетранслируются последовательно.Если после модификации структуры таблицы код триггера оказался некорректным, то при выполнении команды
ERROR: cannot rebuild trigger "SYSTEM"."T_AI" (#36) with procedure #129REBUILD ALL TRIGGERSбудет выдано сообщение «ошибка трансляции запроса» из-за получения кода завершения2210. При этом в консоль ядра будет выведено сообщение вида:и дальнейшая повторная трансляция триггеров будет прекращена.
-
Для получения списка триггеров, для которых повторная трансляция завершилась не успешно, необходимо использовать следующий запрос:
select $$$NAME from $$$trig where 1 = (select count(*) from $$$proc where $$$id = $$$proc);
-
После коррекции исходного кода триггера необходимо повторно выполнить команду
REBUILD ALL TRIGGERSдля повторной трансляции прочих триггеров таблицы.
Пример
create or replace table t_stat (c varchar(10));
create or replace table t_at(i int);
create or replace trigger t_ai after insert on t_at for each
statement execute
code
execute direct ("INSERT INTO T_STAT VALUES ('INSERT');");
end;
alter table t_at add column j int;
alter table t_at rebuild all triggers;
insert into t_at values (100, 1);
select * from t_at;
select * from t_stat;
Синтаксические правила добавления файла
-
<Символьный литерал>задает идентификатор устройства, на котором должен расплагаться добавляемый файл. -
Устройство должно быть предварительно создано с помощью команды
CREATE DEVICE, например:create device "DB00" directory 'c:\linter\db\DEMO';
-
Длина
<символьного литерала>должна быть 4 символа. -
Если
<имя устройства>не задано, то по умолчанию используется устройство, выделенное пользователю, выполняюшему команду, а если и оно не назначено, тоSY00.Примечание
В момент выполнения команды не проверяется наличие в ОС переменной окружения
SY00.
Общие правила добавления файла
-
Суммарное количество файлов таблицы не должно превышать
63. -
<Размер файла>задается в страницах (страница равна 4 Кбайтам).
Примеры
SY00=c:\linter\db\DEMO
DB00=d:\db_market
create or replace table tst1 (i int) datafiles 3;
SQL>show tst1
…
Файлов данных: 3 ("SY00" 7, "SY00" 2, "SY00" 2)
! файл на DB00, размер файла 30 страниц
alter table tst1 add datafile ('DB00' 30);
SQL>show tst1
…
Файлов данных: 4 ("SY00" 7, "SY00" 2, "SY00" 2, "DB00" 30)
! файл на DB00, размер файла 2 страницы
alter table tst1 add datafile ('DB00');
SQL>show tst1
…
Файлов данных: 5 ("SY00" 7, "SY00" 2, "SY00" 2, "DB00" 30, "DB00" 2)
! файл на SY00, размер файла 100 страниц
alter table tst1 add datafile (100);
SQL>show tst1
…
Файлов данных: 6 ("SY00" 7, "SY00" 2, "SY00" 2, "DB00" 30, "DB00" 2, "SY00" 100)
! файл на SY00, размер файла 2 страницы
alter table tst1 add datafile;
SQL>show tst1
…
Файлов данных: 7 ("SY00" 7, "SY00" 2, "SY00" 2, "DB00" 30, "DB00" 2, "SY00" 100, "SY00" 2)
alter table tst1 add datafile ();
SQL>show tst1
…
Файлов данных: 8 ("SY00" 7, "SY00" 2, "SY00" 2, "DB00" 30, "DB00" 2, "SY00" 100, "SY00" 2, "SY00" 2)
Общие правила модификации файла
-
<Номер файла>должен ссылаться на существующий файл таблицы. -
<Размер файла>может быть изменен только в сторону увеличения. -
Узнать текущий размер файла можно с помощью команды
showутилиты inl или SQL-функцииLINTER_FILE_SIZE, например,! узнать идентификатор таблицы MOD_FILE: select $$$s11 from $$$sysrl where $$$s13='MOD_FILE'; 729 ! узнать размер 3–го datafile таблицы MOD_FILE select LINTER_FILE_SIZE (729, 1, 3); 5
-
<Размер файла>задается в страницах (страница равна 4 Кбайтам).
Пример
create or replace table mod_file (i int) DATAFILES 5; alter table mod_file modify datafile 3 (20);
Общие правила удаления файла
-
Конструкция удаляет из таблицы последний файл указанного типа (т.е. файл с максимальным номером). Первый файл удалить нельзя.
-
Удаляемый файл не должен содержать данных и не использоваться в момент выполнения данной команды.
Примечание
Проверить заполненность файлов можно с помощью ключей -fd, -fi, -fb утилиты testdb (см. документ «Тестирование базы данных», пункты «Вывод ROWID по экстенту файла данных», «Вывод ROWID по экстенту файла индексов», «Вывод ROWID по экстенту BLOB-файла»).
Пример
create or replace table mod_file (i int) DATAFILES 5; alter table mod_file drop datafile;