Создайте ограничение в поле в зависимости от другого поля - PullRequest
0 голосов
/ 04 августа 2011

у меня есть таблица T1 с тремя полями:

id integer
Vocation integer : VOCATION = 1 or 2 or 3 or 4or 5
TYPE integer     : TYPE = 1 or 2 or 3 or 4 or 5 or 6 or 7 or 8

Тип зависит от призвания. Пример:

  • если VOCATION = 1, TYPE должен быть = 2 или 3 или 4 или 6
  • если VOCATION = 2, TYPE должен быть = 4 или 5 и т. Д.

Я работаю с sqlserver2008

Я бы создал ограничение в TYPE, которое заставит значение ограничения быть, например, 4 или 5, если значение VOCATION равно 2 и т. Д.

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

Это код триггера (sql)

CREATE TRIGGER [dbo].[tg_T1]
ON [dbo].[T1]
after INSERT, UPDATE
AS

DECLARE @VOCATION int
DECLARE @TYPE int

BEGIN
   IF @VOCATION =1 
   SET @TYPE = 2
END

Ответы [ 3 ]

1 голос
/ 04 августа 2011

Это можно решить без триггера, используя проверочное ограничение. Но вам нужно убедиться, что вы одновременно обновляете VOCATION и TYPE, чтобы избежать исключений. То есть, если VOCATION = 2 и TYPE = 5, то вы не сможете, например, обновить VOCATION с помощью 1, не изменив TYPE на одно из соответствующих значений, также вам не разрешат обновить TYPE с 6 без соответствующего изменения VOCATION. Вы по-прежнему сможете обновлять TYPE без изменения VOCATION, если условие ограничения позволяет это.

Вот определение ограничения:

ALTER TABLE dbo.T1
ADD CONSTRAINT CK_T1_TypeVocation
  CHECK (
    VOCATION = 1 AND TYPE IN (2, 3, 4, 6)
    OR
    VOCATION = 2 AND TYPE IN (4, 5)
    OR
    … /* other conditions as necessary */
  )
1 голос
/ 04 августа 2011

Одна идея:

  • создать другую таблицу (скажем, T1Check) только с VOCATION и TYPE
  • первичный ключ на T1Check - это оба столбца
  • заполнить T1Check действительными парами
  • создать внешний ключ на T1 для VOCATION и TYPE, который ссылается на T1Check

Это означает, что данные будут разрешены только в T1, что соответствует разрешенным парам в T1Check.

Что еще более важно, вы можете добавить новую комбинацию VOCATION и TYPE к T1Check без изменения какого-либо кода (триггера) или ограничений CHECK. Все данные управляются и их легче обслуживать.

Вы даже можете создать графический интерфейс, чтобы позволить бизнес-пользователю определять новые правила VOCATION / TYPE в T1Check.

1 голос
/ 04 августа 2011

В триггере нельзя просто ссылаться на столбцы как на переменные.Вам нужно использовать INSERTED набор строк.Это представляет данные, которые были вставлены и привели к срабатыванию триггера.Потратьте некоторое время, чтобы прочитать эту статью MSDN: http://msdn.microsoft.com/en-us/library/aa258254(v=sql.80).aspx

Для кода это будет выглядеть примерно так:

...