Замена устаревшего пользовательского типа SQL Server с привязанным правилом и значением по умолчанию - PullRequest
6 голосов
/ 06 февраля 2011

У нас есть пользовательский тип данных YesNo, который имеет псевдоним char (1). Тип имеет связанное правило (должно быть Y или N) и значение по умолчанию (N).

Целью этого является то, что когда кто-либо из команды разработчиков создает новое поле типа YesNo, правило и значение по умолчанию автоматически привязываются к новому столбцу.

Правила и значения по умолчанию устарели и не будут доступны в следующей будущей версии SQL Server, есть ли другой способ достижения той же функциональности?

Я должен добавить, что мне известно, что я мог бы использовать ограничения CHECK и DEFAULT для репликации функциональности связанных объектов Rule и Defalut, однако они должны применяться при каждом использовании типа, а не для получения функциональности. «бесплатно» с помощью UDT, который имеет связанное правило и значение по умолчанию.

Эта публикация относится к базе данных, которая поддерживает существующее приложение, а не к новой разработке, поэтому я знаю, что наше использование UDT менее чем оптимально.

Я подозреваю, что ответом на вопрос является «Нет», однако обычно, когда функции устарели, обычно есть альтернативный синтаксис, который можно использовать как замену, поэтому я хотел поставить вопрос на тот случай, если кто-то знает об альтернативе .

Ответы [ 3 ]

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

Ограничения по умолчанию и проверка ограничений ...

CREATE TABLE foo (
   col1 int...
   YesNo char(1) NOT NULL DEFAULT ('N')
                   CONSTRAINT CK_foo_YesNo CHECK (YesNo IN 'Y', 'N'))
   col2 ...
   )

Лично я склонен не использовать UDT (в прошлый раз это был SQL Server 6.5 IIRC), потому что в случае каких-либо изменений нет типа ALTER TYPE ...

Что касается амортизации ..

Впервые упоминается в CREATE RULE для SQL Server 2005. Итак, нам сообщили 6 лет и 3 выпуска назад

Для SQL Server 2000 ...

"Правила, функция обратной совместимости, выполняют некоторые из тех же функций, что и проверочные ограничения. Ограничения CHECK, созданные с использованием ключевого слова CHECK в ALTER или CREATE TABLE, являются предпочтительным стандартным способом ..."

То же самое относится к CREATE DEFAULT , объекту , а не ограничению

Это 11 лет назад

0 голосов
/ 25 августа 2014

Xquery немного тупо использовать для чего-то такого простого. Обычно я использую его для более сложной типизации данных, но это (я думаю) отвечает на ваш вопрос относительно замены. Вот как я могу реализовать параметр как типизированный xml, который должен быть либо true, либо false. Вы можете расширить его на «да / нет», «щенок / котенок» или что угодно.

if schema_id(N'chamomile') is null
  execute (N'create schema chamomile');
go
set nocount on;
go
/*
  All content is licensed as [chamomile] (http://www.katherinelightsey.com/#!license/cjlz) and 
    copyright Katherine Elizabeth Lightsey, 1959-2014 (aka; my life), all rights reserved,
    and as open source under the GNU Affero GPL (http://www.gnu.org/licenses/agpl-3.0.html).
  ---------------------------------------------
*/
if exists
   (select xml_collection_id
    from   sys.xml_schema_collections as true_false
    where  true_false.name = 'true_false'
           and true_false.schema_id = schema_id(N'chamomile'))
  drop xml schema collection [chamomile].[true_false];
go
/*
  --
  -- License
  ----------------------------------------------------------------------
  Katherine E. Lightsey
  http://www.katherinelightsey.com

  All content is copyright Katherine Elizabeth Lightsey, 1959-2014 (aka; my life), all rights reserved, 
  licensed as [chamomile] (http://www.katherinelightsey.com/#!license/cjlz) and copyright Katherine Elizabeth Lightsey, 1959-2014 (aka; my life), all rights reserved, 
    and as open source under the GNU Affero GPL (http://www.gnu.org/licenses/agpl-3.0.html).

  --
  -- to view documentation
  -----------------------------------------------------------------------------------------------
  select objtype
       , objname
       , name
       , value
  from   fn_listextendedproperty (null
                  , 'schema'
                  , 'chamomile'
                  , 'xml schema collection'
                  , 'true_false'
                  , default
                  , default);
*/
create xml schema collection [chamomile].[true_false] as N'<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:chamomile="http://www.katherinelightsey.com/" targetNamespace="http://www.katherinelightsey.com/">

    <xsd:element name="true_false" type="chamomile:true_false_type" />

    <xsd:complexType name="true_false_type">
      <xsd:complexContent>
        <xsd:restriction base="xsd:anyType">
          <xsd:attribute name="true_false" type="chamomile:pass_fail_enumeration" default="false" />
        </xsd:restriction>
      </xsd:complexContent>
    </xsd:complexType>

  <xsd:simpleType name="pass_fail_enumeration">
    <xsd:restriction base="xsd:NMTOKEN">
      <xsd:enumeration value="true" />
      <xsd:enumeration value="false" />
    </xsd:restriction>
  </xsd:simpleType>

</xsd:schema>';
go
declare @true_false xml([chamomile].[true_false]) = N'<chamomile:true_false xmlns:chamomile="http://www.katherinelightsey.com/" true_false="true" />';
if (select @true_false.value(N'(/*/@true_false)[1]', N'[sysname]'))
   = N'true'
  select N'true';
go
declare @true_false xml([chamomile].[true_false]) = N'<chamomile:true_false xmlns:chamomile="http://www.katherinelightsey.com/" true_false="false" />';
go
declare @true_false xml([chamomile].[true_false]) = N'<chamomile:true_false xmlns:chamomile="http://www.katherinelightsey.com/" true_false="not_valid" />';
go  
0 голосов
/ 06 февраля 2011

«Правила и значения по умолчанию устарели и не будут доступны в следующей версии SQL Server»

1) Насколько я знаю, это неправда. Вы не можете внезапно сломать 99,9% TSQL там!

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

У вас есть официальная ссылка на любое такое объявление?

Пользователь @gbn, кажется, думает, что я защищаю использование устаревших конструкций. Я нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...