Правила устарели, что вместо них (TSQL)?

Правила (Transact-SQL)[1] являются многоразовыми, что позволило преодолеть недостаток невозможности повторного использования проверочных ограничений.

И вот я прочитал [1], что:

  • «Эта функция будет удалена в будущей версии Microsoft SQL Server. Избегайте использования этой функции в новых разработках и планируйте изменение приложений, которые в настоящее время используют эту функцию. Вместо этого мы рекомендуем использовать проверочные ограничения. Проверочные ограничения создаются с помощью ключевое слово CHECK CREATE TABLE или ALTER TABLE"

Итак, что вместо правил и почему они устарели?


==== Обновление:
AlexKuznetsov, ограничения проверки на уровне таблицы ужасно медленные?
Или ограничения проверки на уровне таблицы с использованием функций медленнее по сравнению с ограничениями проверки на уровне столбца и соотв. правила как их эквиваленты (поскольку правила только на уровне столбца)?

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

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

[1]
Онлайн-книги по MS SQL Server 2008 R2. СОЗДАТЬ ПРАВИЛО (Transact-SQL)
http://msdn.microsoft.com/en-us/library/ms188064.aspx


person Gennady Vanin Геннадий Вани&    schedule 01.10.2010    source источник
comment
Вы только что сами это процитировали -- вместо правил [w]e recommend that you use check constraints instead. Check constraints are created by using the CHECK keyword of CREATE TABLE or ALTER TABLE   -  person LittleBobbyTables - Au Revoir    schedule 01.10.2010


Ответы (2)


Ну, одна причина, по которой правила, вероятно, отходят на второй план, заключается в том, что я считаю, что с правилами у вас может быть только одно правило для каждого столбца, и они проверяют только данные, поступающие в базу данных, то есть они не проверяют существующие данные, уже находящиеся в базе данных. С проверочными ограничениями вы можете иметь несколько ограничений для данного столбца, и они применяются ко всем данным (входящие данные и данные, уже находящиеся в базе данных). Учитывая, что правила кажутся плохим решением для проверки ограничений, Microsoft, вероятно, наконец поняла, что пришло время избавиться от них, к тому же они не являются стандартом SQL.

Если контрольное ограничение не помогает, вы также можете использовать триггер для более сложной логики.

person Kuberchaun    schedule 01.10.2010

Если вы обеспокоены тем, что хотите написать «код» для ограничения один раз и повторно использовать его в нескольких столбцах, я предлагаю вам сделать следующее:

Создайте функцию с вашими правилами ограничения:

CREATE FUNCTION schema.PositiveInteger(INT val)
RETURNS INT AS
BEGIN
    IF (val > 0) RETURN 1
    ELSE RETURN 0
END

Добавьте эту функцию в качестве ограничения для столбца:

ALTER TABLE tbl ADD CONSTRAINT chkMyRules CHECK (schema.PositiveInteger(tbl.IntColumn) = 1);

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

CREATE FUNCTION ... (INT val, DATETIME date) RETURNS INT AS ......
ALTER TABLE tbl ADD CONSTRAINT chkMultipleCols CHECK (func(col1, col2) = 1);

Наслаждаться!

person Jeff Wight    schedule 01.10.2010
comment
не очень хорошая часть в этом - медлительность: этот подход ужасно медленный - person A-K; 01.10.2010
comment
Спасибо за отзыв. Можете ли вы получить его? Также есть ли у вас какие-либо идеи, что производительность правил по сравнению с этим? Я знаю, что проверка ограничений имеет побочные эффекты (tinyurl.com/2bc2xoe) (и я заметил, что вы видели эту страницу ранее), но я должен представить, что эти побочные эффекты присутствуют и в Правилах. В качестве замены правил, я думаю, это сработает довольно хорошо. - person Jeff Wight; 01.10.2010
comment
Джефф, я проголосовал за ваш ответ как за полезный, но он несколько ортогонален моему вопросу о введении современных (новых) изменений, политик, тенденций. - person Gennady Vanin Геннадий Вани&; 02.10.2010