Замена устаревшего пользовательского типа SQL Server с привязанным правилом и значением по умолчанию

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

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

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

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

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

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


person Adam Jones    schedule 06.02.2011    source источник
comment
Я думаю, вы невнимательно прочитали статью. CREATE RULE и CREATE DEFAULT устарели в пользу указания правил DEFAULT и CHECK внутри инструкций CREATE TABLE или ALTER TABLE.   -  person Bill    schedule 06.02.2011
comment
где я всегда заявляю о своем.   -  person Mitch Wheat    schedule 06.02.2011
comment
Изменить, чтобы отразить правильную шкалу времени устаревания.   -  person Adam Jones    schedule 06.02.2011
comment
@Bill Я понимаю, что они хотят, чтобы я использовал это, в этом смысл моего поста. Использование ограничений требует, чтобы разработчик добавлял ограничения в каждую таблицу каждый раз, когда используется UDT, тогда как при использовании UDT с привязанным правилом и значением по умолчанию вы получаете это бесплатно каждый раз, когда используется тип, что устраняет точку потенциальной человеческой ошибки в наш процесс разработки.   -  person Adam Jones    schedule 06.02.2011


Ответы (3)


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

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 на случай, если что-то изменится...

Что касается устаревания..

Впервые упоминается в разделе СОЗДАТЬ ПРАВИЛО для SQL Server 2005. .Так нам сказали 6 лет и 3 выпуска назад

Для SQL Server 2000...

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

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

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

person gbn    schedule 06.02.2011
comment
Я бы тоже хотел избавиться от UDT, но в этом случае они полезны и являются частью этой конкретной базы данных, которая существует уже давно. Я знаю, что я мог бы обновить каждое использование типа, чтобы иметь ограничение и значение по умолчанию, однако это означает применение ограничения и значения по умолчанию каждый раз, когда используется тип, я спрашивал, есть ли способ достичь того, что у нас есть на данный момент у которого есть тип, который имеет значение по умолчанию и может принимать только определенные значения без кодирования кода при каждом отдельном использовании. - person Adam Jones; 06.02.2011
comment
@Adam Jones: не совсем то, что вы хотите, но задумывались ли вы об использовании ненулевого бита и изменении на Y или N в клиенте? Таким образом, это собственный тип данных со встроенным ограничением только на 2 значения. Временно вы можете использовать вычисляемый столбец, чтобы предоставить Y или N для чтения: вам нужно только изменить запись на бит. - person gbn; 06.02.2011
comment
Спасибо за предложение, это возможность на будущее. В какой-то момент я хотел бы удалить все UDT и изменить значение YesNo на ненулевой бит в списке TODO. Вопрос действительно был любопытным. Я искал замену нашей текущей функциональности и ничего не мог найти, я задал вопрос здесь на случай, если я что-то пропустил. К сожалению, я подозреваю, что короткий ответ на мой вопрос — «Нет». - person Adam Jones; 06.02.2011

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

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

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

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

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

person Mitch Wheat    schedule 06.02.2011
comment
СОЗДАТЬ ПРАВИЛО для SQL Server 2005. у меня было всего 6 лет и 3 релиза. Для SQL Server 2000... правила, функция обратной совместимости, выполняет некоторые из тех же функций, что и проверочные ограничения. Ограничения CHECK, созданные с использованием ключевого слова CHECK в ALTER или CREATE TABLE, являются предпочтительным стандартным способом... Это 11 лет... - person gbn; 06.02.2011
comment
Обращаясь к ним в своем ответе: есть ли у вас официальная ссылка на какое-либо такое объявление? и насколько я знаю, это не так. Вы не можете внезапно сломать 99,9% TSQL! У тебя было достаточно времени, чтобы приспособиться... - person gbn; 06.02.2011
comment
@gbn: я понятия не имею, о чем ты говоришь. Я имею в виду все, что «устаревшее». Я лично не пользуюсь Правилами. Я объявляю свои ограничения встроенными (как я уже говорил в другом месте этого вопроса) - person Mitch Wheat; 06.02.2011
comment
Когда OP сказал, что правила и значения по умолчанию устарели... это относится к объектам правил (упомянутым в предыдущем комментарии) и по умолчанию объекты, а не ограничения по умолчанию, связанные с таблицами, которые используете вы, я и 99,9%+ TSQL. Если вы никогда не использовали их или не знали о них, то достаточно справедливо. MS предоставляет информацию об устаревших и прекращенных функциях в BOL, обычно с уведомлением о трех версиях. - person gbn; 06.02.2011
comment
@gbn: как я уже сказал, я знаю об этом. Вы, кажется, придираетесь к ошибкам без причины. - person Mitch Wheat; 06.02.2011
comment
В таком случае я не понимаю, к чему относится ваш ответ или в чем его смысл. Если вы знаете об объектах «Правило» и «По умолчанию» и знаете об устаревании/прекращении поддержки, то ваш ответ не показывает этого. Похоже, вы действительно используете устаревшие объекты и оспариваете ОП по этому поводу. - person gbn; 06.02.2011
comment
@gbn: я не это говорю: я бы никогда не предложил кому-то использовать устаревшую конструкцию. Период. - person Mitch Wheat; 06.02.2011
comment
Извините, перечитайте страницу MSDN msdn.microsoft.com/en-us/ library/ms143729.aspx, и они перечислены для удаления в будущей версии SQL Server, а не в следующей версии. - person Adam Jones; 06.02.2011
comment
Однако моя первоначальная точка зрения остается неизменной, я знаю, что могу добиться той же функциональности для таблицы за таблицей, используя ограничения CHECK и DEFAULT, но это зависит от разработчика, вручную добавляющего ограничения, когда новое поле добавляется в таблицу, и это открыто для пользователя ошибка. Мой вопрос заключается в том, есть ли какой-либо способ достижения той же функциональности, которая в настоящее время достигается с помощью правил и значений по умолчанию, привязанных к определяемому пользователем типу, то есть правило и значение по умолчанию предоставляются бесплатно при использовании типа. - person Adam Jones; 06.02.2011
comment
@Mitch Wheat: ты сказал, насколько я знаю, это неправда. к устареванию, а затем требуют ссылку. Ваши комментарии говорят об обратном, что вы знаете. Затем вы обвиняете меня в том, что я придираюсь к тому, что вы на самом деле опубликовали в качестве ответа. Еще раз: В чем смысл вашего ответа?. Прежде чем ответить на этот комментарий, прочитайте свой собственный ответ. - person gbn; 06.02.2011
comment
Правила и значения по умолчанию устарели, И не будут доступны в следующей версии SQL Server... на самом деле это ДВА оператора. Первый из них бесспорно верен, как показано в уже предоставленных ссылках. Однако вы правы в том, что второе утверждение неверно... пока. Тем не менее, я не могу не согласиться с @gbh: ваш ответ несколько вводит в заблуждение. Это помогло бы немного прояснить ситуацию, чтобы читатели из будущего (такие, как я ^_^.) не запутались. - person Crono; 27.07.2018

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

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  
person Katherine Elizabeth Lightsey    schedule 25.08.2014