Создайте тип со значением по умолчанию и проверьте ограничение в SQL Server 2005 - PullRequest
2 голосов
/ 06 февраля 2009

Каков рекомендуемый способ создания типа в MSSQL 2005 со значением по умолчанию и проверочным ограничением для использования в нескольких столбцах?

Я не хочу добавлять проверочное ограничение и значение по умолчанию для каждого столбца.

Моя первая идея состояла в том, чтобы создать стандартное правило и правило для привязки к этому типу, но в онлайновых книгах четко указано, что мы должны избегать использования CREATE DEFAULT и CREATE RULE для новой разработки, поскольку эти команды будут удалены в будущей версии.

Ответы [ 5 ]

1 голос
/ 06 февраля 2009

Да, хорошо. К счастью, это все еще есть SQL Server 2008. Статья Робин Пейдж на Simple-Talk объясняет все это

Инструмент проверки данных Robyn Page SQL Server

(У меня такое чувство, что я немного помог ей с этим) Просто создайте Type и привяжите к нему настройки по умолчанию и правила.

Вопрос об устаревании немного позорен. Все, что произошло, это то, что правила , типы и значения по умолчанию не соответствуют стандарту SQL. Теперь предпочтительным способом является использование ограничений для того же, но гораздо менее элегантно, если вам нужно сделать это равномерно в нескольких таблицах. Кроме того, только такие люди, как Джо Селко, понимают ограничения во всей их полноте. Конечно, как и все, что я не делаю.

0 голосов
/ 11 апреля 2009

Я использую интеграцию SQL CLR с идеей, что мы храним данные с общими типами, такими как (char, int), но затем контекстуализируем данные с ограничениями, в частности, с проверочными ограничениями.

Создайте тип данных в проекте базы данных Visual Studio (C #), который внутренне сохраняет значение как примитивный тип (например, int, float, string и т. Д.), Но ограничивает значения, с которыми он может быть создан. Например, если у вас был тип Score, конструктор выдаст ошибку, если значение выходит за пределы диапазона от 0 до 100, гарантируя, что могут существовать только допустимые объекты Score.

Ваше проверочное ограничение в таблице базы данных будет просто включать вызов функции CLR (которую вы также создадите в своем проекте базы данных), которая просто пытается создать экземпляр вашего типа данных C # с новым значением столбца, которое вы передаете ему. , Функция завершается успешно, если значение построено, и завершается ошибкой, если конструктор выдает ошибку.

Затем у вас есть ограниченный тип данных, централизованный в вашем коде C #, который можно использовать во всем приложении, что также обеспечивает принудительное использование значений в базе данных.

0 голосов
/ 06 февраля 2009

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

0 голосов
/ 06 февраля 2009

Я использую CREATE TYPE и CREATE RULE, чтобы установить ограничения по умолчанию, но не значение по умолчанию; это все еще делается на уровне таблицы, но нет веской причины, почему вы не можете. Мне также нравится использовать именованные ограничения на уровне таблицы, а не полагаться на сгенерированные системой имена для синтаксиса на уровне столбцов.

Я использую этот шаблонный скрипт для моего движка сниппета; "~~" - разделители параметров замены:

IF NOT EXISTS
(
    SELECT
        *
    FROM
        INFORMATION_SCHEMA.DOMAINS d
    WHERE
        (d.DOMAIN_CATALOG = DB_NAME()) AND
        (d.DOMAIN_SCHEMA = N'~~Schema.Name~~') AND
        (d.DOMAIN_NAME = N'Type~~TypeAndRule.Name~~')
)
BEGIN
    PRINT N'  ~~Schema.Name~~.Type~~TypeAndRule.Name~~, ~~Schema.Name~~.Rule~~TypeAndRule.Name~~';

    EXEC sp_executesql @statement = N'CREATE TYPE ~~Schema.Name~~.Type~~TypeAndRule.Name~~ FROM ~~baseTypeDef~~ NOT NULL;';
    EXEC sp_addextendedproperty N'MS_Description', N'Encapsulates XXX.', N'SCHEMA', N'~~Schema.Name~~', N'TYPE', N'Type~~TypeAndRule.Name~~';

    EXEC sp_executesql @statement = N'CREATE RULE ~~Schema.Name~~.Rule~~TypeAndRule.Name~~ AS (@value ~~atValueComparison~~);';
    EXEC sp_addextendedproperty N'MS_Description', N'Enforces XXX.', N'SCHEMA', N'~~Schema.Name~~', N'RULE', N'Rule~~TypeAndRule.Name~~';

    EXEC sp_bindrule @rulename = N'~~Schema.Name~~.Rule~~TypeAndRule.Name~~', @objname = N'~~Schema.Name~~.Type~~TypeAndRule.Name~~';
END;
GO
  1. TypeAndRule.Name - базовое имя.
  2. Schema.Name - схема; например ПСЭ.
  3. baseTypeDef - определение базового типа; например int или nvarchar (50).
  4. atValueComparison является выражением ограничения.
  5. Условие IF NOT EXISTS позволяет сценарию запускаться несколько раз без ошибок.

Операторы CREATE TYPE / RULE изначально устарели во временном интервале SQL 2005 и все еще существуют. Я сомневаюсь, что они вызовут ошибки сценария в любое время до 2015 года, так как MS должна поддерживать обратную совместимость: -)

0 голосов
/ 06 февраля 2009

Использовать проверочное ограничение

пример

create table bla (value varchar(50) 
default 'A' 
constraint CheckValue check (len(value) > 0))
go
insert bla default values
go
insert bla values('1')
go
insert bla values('') --will fail
go
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...