Модификация таблицы

Функция

Определение оператора изменения структуры и/или атрибутов базовой таблицы.

Спецификация
               
< переименование таблицы >::=
< изменение уровня мандатного контроля доступа таблицы >::=
SET LEVEL (RAL, WAL)
< модификация триггеров >::=
REBUILD ALL TRIGGERS
< модификация файловых параметров таблицы >::=
< добавление первичного ключа >::=
< добавление уникального ключа >::=
< добавление внешнего ключа >::=
< добавление CHECK-условия таблицы >::=
< удаление первичного ключа >::=
DROP PRIMARY KEY [WITHOUT INDEX]
< удаление уникального ключа >::=
DROP UNIQUE (имя столбца[, …] | VALUE) [WITHOUT INDEX]
< удаление внешнего ключа >::=
DROP FOREIGN KEY (имя столбца[, …]) [WITHOUT INDEX]
< удаление CHECK-условий таблицы >::=
DROP CHECK
< установка режима циклической таблицы >::=
< отмена режима циклической таблицы >::=
CANCEL RECORDS LIMIT
< добавление файла >::=
ADD {INDEXFILE | DATAFILE | BLOBFILE} [([имя устройства] [размер файла][, …])]
< модификация файла >::=
MODIFY {INDEXFILE | DATAFILE | BLOBFILE} номер файла [([имя устройства] [размер файла][, …])]
< удаление файла >::=
DROP {INDEXFILE | DATAFILE | BLOBFILE}
< ссылочная целостность >::=
< режим модификации индекса >::=
[INDEXFILE номер файла] [BY APPEND]
< новое имя таблицы >::=
Общие правила
  1. Для выполнения команды необходимы уровень доступа RESOURCE к БД и привилегия доступа ALTER к изменяемой таблице.

Синтаксические правила переименования таблицы
  1. При переименовании таблицы нельзя изменить ее схему.

Общие правила переименования таблицы
  1. Переименование системных таблиц не допускается.

  2. Операция переименования таблицы не проверяет возможное использование заменяемого имени таблицы в других объектах БД (представлениях, синонимах, хранимых процедурах), поэтому, если такие объекты существуют, они перестанут работать.

Примеры
alter table tab rename to "Заказы";
alter table user1.sale rename to "Продажи";
Синтаксические правила добавления первичного ключа
  1. Запрещено добавление атрибута PRIMARY KEY для псевдостолбцов (ROWID, ROWTIME и т.п.).

  2. Запрещено создание PRIMARY KEY на ту же комбинацию столбцов, на которую уже есть уникальный ключ (UNIQUE) с тем же порядком столбцов (верно как для простых, так и для составных ключей).

  3. Комбинации атрибутов PRIMARY KEY и NULL недопустима.

  4. Для столбцов типа DATE, BOOLEAN, BLOB, EXTFILE атрибут PRIMARY KEY недопустим.

Общие правила добавления первичного ключа
  1. Изменение первичного ключа с помощью его переопределения не допускается. В этом случае необходимо сначала его удалить (см. конструкцию < удаление первичного ключа >), а потом создать заново.

    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);
Синтаксические правила добавления уникального ключа
  1. Запрещено добавление атрибута UNIQUE для псевдостолбцов (ROWID, ROWTIME и т.п.).

  2. Запрещено создание уникального ключа на ту же комбинацию столбцов, на которую уже есть первичный ключ (PRIMARY KEY) или уникальный ключ с тем же порядком столбцов. Привило распространяется для простых и для составных ключей.

  3. Для столбцов типа DATE, BOOLEAN, BLOB, EXTFILE атрибут UNIQUE недопустим.

Общие правила добавления уникального ключа
  1. Конструкция UNIQUE VALUE создаёт уникальный ключ из всех столбцов таблицы (за исключением псевдостолбцов).

    // создание уникального ключа из столбцов i, ch, d
    create or replace table tst (i smallint, ch char(10), d float);
    alter table tst add unique (value);
  2. Конструкция UNIQUE VALUE создаёт уникальный ключ только из тех столбцов, которые существуют в таблице на текущий момент. Если в таблицу будут добавлены новые столбцы, они автоматически не войдут в составной уникальный ключ – надо будет повторить операцию UNIQUE VALUE.

  3. Опция 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;
  4. Опция 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);
Синтаксические правила добавления внешнего ключа
  1. Описание опции MATCH и конструкции < спецификация действий > приведено в пункте «Создание таблицы. Внешний ключ».

  2. Если < список столбцов > ссылается на первичный ключ таблицы, то этот < список столбцов > можно не указывать.

    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);
Общие правила добавления внешнего ключа
  1. В таблицу можно добавить несколько внешних ключей.

    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-условия таблицы
  1. Использование столбцов с атрибутом AUTOROWID, псевдостолбцов ROWID, ROWTIME и DBROWTIME и предиката [NOT] CONTAINS (см. документ «СУБД ЛИНТЕР. Полнотекстовый поиск в базе данных», пункт «Предикат полнотекстового поиска») в < логическом выражении > запрещено.

  2. В < логическом выражении > разрешено использование псевдозначений 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); // ошибка
  3. Таблица может иметь произвольное число ограничений целостности типа 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));
  4. Ограничение целостности CHECK для таблицы может содержать ссылки на любые столбцы этой же таблицы.

  5. Ограничение целостности типа CHECK не может содержать подзапросов, агрегатных функций, конструкций CASE и CAST, функций SECURITY, INDEXTIME, LINIDXINFO, LEAD, LAG, GREATEST, LEAST, RANK, GETTEXTPOS, GET_EVENTS_STATE.

Общие правила добавления CHECK-условия таблицы
  1. Ограничения целостности типа CHECK для таблицы проверяются в том же порядке, в каком они создавались.

  2. Добавленное CHECK-условие присоединяется по логическому «И» ко всем ранее заданным условиям CHECK.

  3. При выполнении операции DELETE CHECK-условия не проверяются.

Общие правила изменения уровня мандатного контроля доступа таблицы
  1. < Идентификатор > задает имя соответствующего уровня доступа (на чтение данных из таблицы (RAL) или на добавление/корректировку данных (WAL)). Допускается назначать только существующие в БД уровни доступа.

  2. Указание мандатного доступа запрещено для системных таблиц.

  3. Более подробно работа с уровнями мандатного контроля доступа описана в документе «СУБД ЛИНТЕР. Администрирование комплекса средств защиты данных», пункт «Управление уровнем доступа к таблице».

  4. Отменить (изменить) мандатный уровень доступа к таблице невозможно (например, нельзя хранящиеся в БД секретные данные объявить несекретными).

Примеры
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);
Синтаксические правила удаления первичного ключа
  1. Опция WITHOUT INDEX задает режим отмены атрибута столбца без удаления построенного по этому столбцу индекса (например, был создан столбец, для него создан индекс, потом столбец был объявлен как PRIMARY KEY, а затем этот атрибут столбца отменяется с данной опцией – индекс останется).

  2. По умолчанию (опция WITHOUT INDEX не задана) индекс удаляется.

Общие правила удаления первичного ключа
  1. Таблица, к которой применяется конструкция < удаление первичного ключа >, должна иметь первичный ключ.

  2. Удалить первичный ключ можно только в том случае, если на него нет внешних ссылок из других таблиц, иначе надо предварительно удалить все внешние ссылки на него (см. конструкцию < удаление внешнего ключа >).

Пример

Удаление первичного ключа, на который есть ссылки внешних ключей.

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;
Синтаксические правила удаления уникального ключа
  1. Опция WITHOUT INDEX задает режим отмены атрибута столбца без удаления построенного по этому столбцу индекса (например, был создан столбец, для него создан индекс, потом столбец был объявлен как UNIQUE, а затем этот атрибут столбца отменяется с данной опцией – индекс останется).

  2. По умолчанию (опция WITHOUT INDEX не задана) индекс удаляется.

Общие правила удаления уникального ключа
  1. Таблица, к которой применяется конструкция < удаление уникального ключа >, должна иметь соответствующий уникальный ключ.

    create or replace table tst (i int, ch char(10), unique (i, ch));
    alter table tst drop unique (i, ch);
  2. Если для удаления уникального ключа используется опция 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); // ОК
Синтаксические правила удаления внешнего ключа
  1. Опция WITHOUT INDEX задает режим отмены атрибута столбца без удаления построенного по этому столбцу индекса (например, был создан столбец, для него создан индекс, потом столбец был объявлен как FOREIGN KEY (или вошел в состав внешнего ключа), затем этот атрибут столбца отменяется данной опцией – индекс останется).

  2. По умолчанию (опция WITHOUT INDEX не задана) индекс удаляется.

Общие правила удаления внешнего ключа
  1. Таблица, к которой применяется конструкция < удаление внешнего ключа >, должна иметь соответствующий внешний ключ.

    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-условий таблицы
  1. Удаляются сразу все CHECK-условия таблицы. Выборочное удаление CHECK-условия не поддерживается.

  2. CHECK-условия для столбцов остаются неизменными

Пример
alter table tst drop check;
Синтаксические правила установки режима циклической таблицы
  1. Значение параметра < количество записей > должно быть в интервале от 1 до 1073741823 (0x3FFFFFFF).

Общие правила установки режима циклической таблицы
  1. Конструкция SET RECORDS LIMIT устанавливает режим циклической таблицы для указанной базовой таблицы.

  2. Параметр < количество записей > задает максимальное количество записей в циклической таблице. В случае превышения указанного значения новые записи будут размещаться на месте самых старых.

    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
  3. Если на момент установки циклического режима таблица содержала большее количество записей, чем задано в параметре < количество записей >, то все записи, номера (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
  4. Для циклических таблиц поддерживаются все типы триггеров, кроме «instead of delete». Попытка преобразовать таблицу с имеющимися триггерами «instead of delete» в циклическую или создать такой триггер для уже существующей циклической таблицы будет неуспешной.

  5. В случае автоматического удаления старых записей при добавлении новых записей в циклическую таблицу поддерживается следующий порядок срабатывания триггеров (если соответствующие триггеры созданы):

    • триггеры «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» для добавляемой записи.

  6. Особенности добавления новых записей в переполненную циклическую таблицу из подзапроса (INSERT FROM SELECT) см. в подразделе «Добавление записи» (оператор INSERT).

  7. Для системных таблиц циклический режим запрещен.

Общие правила отмены режима циклической таблицы
  1. Конструкция CANCEL RECORDS LIMIT отменяет ранее установленный режим циклической таблицы. Манипулирование записями таблицы будет выполняться в соответствии с ранее установленными параметрами MAXROWID, MAXROW.

Пример
alter table ct cancel records limit;
Общие правила модификации триггеров
  1. Команду REBUILD ALL TRIGGERS может выполнить только владелец таблицы с уровнем прав не менее RESOURCE.

  2. Для повторной трансляции всех триггеров, настроенных на модифицированную таблицу, необходимо выполнить команду вида:

    ALTER TABLE < имя таблицы > REBUILD ALL TRIGGERS;
  3. При выполнении команды REBUILD ALL TRIGGERS триггеры перетранслируются последовательно.

    Если после модификации структуры таблицы код триггера оказался некорректным, то при выполнении команды REBUILD ALL TRIGGERS будет выдано сообщение «ошибка трансляции запроса» из-за получения кода завершения 2210. При этом в консоль ядра будет выведено сообщение вида:

    ERROR: cannot rebuild trigger "SYSTEM"."T_AI" (#36) with procedure #129

    и дальнейшая повторная трансляция триггеров будет прекращена.

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

    select $$$NAME from $$$trig where 1 = (select count(*) from $$$proc where $$$id = $$$proc);
  5. После коррекции исходного кода триггера необходимо повторно выполнить команду 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;
Синтаксические правила добавления файла
  1. < Символьный литерал > задает идентификатор устройства, на котором должен расплагаться добавляемый файл.

  2. Устройство должно быть предварительно создано с помощью команды CREATE DEVICE, например:

    create device "DB00" directory 'c:\linter\db\DEMO';
  3. Длина < символьного литерала > должна быть 4 символа.

  4. Если < имя устройства > не задано, то по умолчанию используется устройство, выделенное пользователю, выполняюшему команду, а если и оно не назначено, то SY00.

    Примечание

    В момент выполнения команды не проверяется наличие в ОС переменной окружения SY00.

Общие правила добавления файла
  1. Суммарное количество файлов таблицы не должно превышать 63.

  2. < Размер файла > задается в страницах (страница равна 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)
Общие правила модификации файла
  1. < Номер файла > должен ссылаться на существующий файл таблицы.

  2. < Размер файла > может быть изменен только в сторону увеличения.

  3. Узнать текущий размер файла можно с помощью команды 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. < Размер файла > задается в страницах (страница равна 4 Кбайтам).

Пример
create or replace table mod_file (i int) DATAFILES 5;
alter table mod_file modify datafile 3 (20);
Общие правила удаления файла
  1. Конструкция удаляет из таблицы последний файл указанного типа (т.е. файл с максимальным номером). Первый файл удалить нельзя.

  2. Удаляемый файл не должен содержать данных и не использоваться в момент выполнения данной команды.

    Примечание

    Проверить заполненность файлов можно с помощью ключей -fd, -fi, -fb утилиты testdb (см. документ «СУБД ЛИНТЕР. Тестирование базы данных», пункты «Вывод ROWID по экстенту файла данных», «Вывод ROWID по экстенту файла индексов», «Вывод ROWID по экстенту BLOB-файла»).

Пример
create or replace table mod_file (i int) DATAFILES 5;
alter table mod_file drop datafile;