Простое ограничение для ограничения таблицы Oracle одной строкой - PullRequest
9 голосов
/ 29 марта 2011

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

Самым простым способом, о котором я подумал, является поле идентификатора, установленное на 1, и проверочное ограничение на то, что идентификатор должен быть равен 1, - но это добавляет запутанное дополнительное поле в таблицу, так что я надеюсь, что есть что-то очевидное. м отсутствует, как проверочное ограничение, где UNIQUE_FIELD = MAX (UNIQUE_FIELD), что недопустимо.

Ответы [ 3 ]

14 голосов
/ 30 марта 2011

Simplest - это уникальный индекс на основе функции для константы

> create unique index table_uk on one_row_table ('1');

Альтернативы:

Вместо таблицы вы можете иметь представление о DUAL, которое действительно означает, что любое UPDATE будетна самом деле быть СОЗДАТЬ ИЛИ ЗАМЕНИТЬ ВИД, который может не подходить.Функции, возвращающие значения из тела пакета или глобальных контекстов приложения, могут быть обходным путем, если это вызывает проблемы с недействительностью.

С 11g таблицей READ ONLY (или, в более ранних версиях, таблицей в табличном пространстве только для чтения)это вариант.

6 голосов
/ 30 марта 2011

Вот несколько вариантов:

  • Отмена привилегий INSERT для этой таблицы.
  • Управление всем доступом к таблице конфигурации с помощью процедур
  • Замена таблицы конфигурациис представлением, которое скрывает столбец с проверочным ограничением (col = 1) и уникальным ограничением.
  • В любом случае создайте это материализованное представление
  • Создайте таблицу, вызывающую срабатывание на INSERT, которая вызывает исключение
  • Переосмыслите структуру таблицы и добавьте FROM_DATE, чтобы таблица НЕ обновлялась, а вы каждый раз создавали новую строку.Ваша текущая конфигурация будет строкой с самой высокой датой from_date.Представление current_config для этой таблицы полезно.
  • Замените таблицу представлением, определенным как SELECT 1024 as buffer_size, '/var/tmp' as temp_dir, 'other constant' as other_constant from dual.Это не твердое решение.
0 голосов
/ 30 марта 2011
CREATE TABLE Singleton
(x INTEGER NOT NULL UNIQUE CHECK (x = 1),
 col1 INTEGER NOT NULL);

(непроверенные)

SQL не имеет краткого синтаксиса для указания пустого набора атрибутов в качестве ключа, что является позором, потому что это устранит необходимость в избыточном дополнительном столбце. Действующим ключом здесь фактически является пустой набор, поэтому я использовал ограничение UNIQUE вместо PRIMARY KEY для ограничения на x.

...