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

#sql-server #tsql #sql-server-2008 #constraints #code-reuse

#sql-server #tsql #sql-server-2008 #ограничения #повторное использование кода

Вопрос:

Правила (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

Комментарии:

1. Вы только что сами процитировали это — вместо правил, [w]e recommend that you use check constraints instead. Check constraints are created by using the CHECK keyword of CREATE TABLE or ALTER TABLE

Ответ №1:

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

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

Ответ №2:

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

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

 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);
  

Наслаждайтесь!

Комментарии:

1. не самая хорошая часть этого — медлительность: этот подход ужасно медленный

2. Спасибо за информацию. Можете ли вы использовать его исходный код? Также вы имеете какое-либо представление о том, какова производительность правил по сравнению с этим? Я знаю, что есть побочные эффекты для проверки ограничений ( tinyurl.com/2bc2xoe ) (и я замечаю, что вы видели эту страницу раньше), но я должен представить, что эти побочные эффекты присутствуют и в Правилах. Я думаю, что в качестве замены правил это сработало бы довольно хорошо.

3. Джефф, я поддержал твой ответ как полезный, но он несколько ортогональен контексту моего вопроса о введении «современных» (новых) изменений, политик, тенденций.