SqlServer ограничивает значение поля в зависимости от другого значения поля

Как заголовок вопроса, есть ли способ сделать это?

eg:

DrivingLicence
--------------- 
CanDriveCar       (bool) 
CanDriveMotorbike (bool) 
CanDriveBus       (bool)

Вы не можете водить автобус без автомобильных прав, поэтому я хочу, чтобы БД выдавала исключение, если кто-то пытается дать кому-то автобусные права, когда у них нет автомобильных прав.


person fearofawhackplanet    schedule 15.09.2010    source источник


Ответы (1)


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

Если это отдельные лицензии, то я предполагаю, что они будут отдельными строками в вашей таблице, потому что первичный ключ таблицы - надеюсь! - Номер лицензии. И в этом случае ограничения CHECK не будут работать, потому что они применяются только к значениям в одной строке; вам нужно будет использовать триггеры, чтобы проверить, какие лицензии уже есть у драйвера, когда вы добавляете новую.

Итак, ваши варианты:

  1. Водители могут иметь только одну лицензию с одним уникальным номером: используйте ограничение CHECK.
  2. Водители могут иметь несколько лицензий разных типов с разными номерами: используйте триггер
  3. Это сложнее: используйте сохраненный код процедуры или приложения для вставки новых лицензий.

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

И к вашему сведению, в MSSQL нет логического типа данных, возможно, вы имели в виду BIT?

person Pondlife    schedule 15.09.2010
comment
Ответ Мартина был именно тем, что я искал, но спасибо, что указали на некоторые другие вещи, которые я не учел. - person fearofawhackplanet; 15.09.2010