Есть ли альтернатива Microsoft.SqlServer.Management.Smo.SqlDataType, включающая значение для RowVersion? - PullRequest
2 голосов
/ 14 марта 2010

Перечисление Microsoft.SqlServer.Management.Smo.SqlDataType имеет значение для типа timestamp, но не rowversion. Я ищу обновленную версию сборки или альтернативный тип enum, который ее поддерживает.

Существующее перечисление имеет значение Timestamp, но согласно документации rowversion , timestamp «устарело и будет удалено в следующей версии». Я предпочитаю избегать использования устаревших вещей:)

Ответы [ 2 ]

5 голосов
/ 17 марта 2010

Быстрый ответ:

Нет, вам не нужно использовать другой тип.Microsoft.SqlServer.Management.Smo.SqlDataType Тип данных является правильным типом для использования.Несмотря на старое имя, Microsoft.SqlServer.Management.Smo.SqlDataType.Timestamp - это значение, возвращаемое SMO для столбцов SQL Server типа rowversion.

Что является устаревшим, так это использование имени типа "timestamp" в инструкциях SQL Sever DDL.Если ваш код генерирует операторы DDL, содержащие имя типа timestamp, и отправляет их на SQL Server, вам следует изменить код на использование [rowversion][4].Но если вы просто используете SMO или любой из типов, которые используют тип Microsoft.SqlServer.Management.Smo.SqlDataType, вы не будете затронуты изменением имени на стороне сервера.

Длинный ответ:

Я собираюсь объединить несколько цитат здесь, чтобы избежать повторного изобретения колеса.Сначала немного истории из http://www.mssqltips.com/tip.asp?tip=1501:

Этот тип данных [ROWVERSION] был введен в SQL Server 2000, чтобы в конечном итоге заменить тип данных временной метки.В определении ANSI-SQL метка времени определяется как дата и время, тогда как Microsoft реализовала ее как двоичное значение, которое изменяется при каждом изменении строки.Microsoft предупредила, что использование метки времени в конечном итоге будет изменено в соответствии со стандартом ANSI, поэтому следует избегать ее использования для управления параллелизмом.В настоящее время как временная метка, так и инверсия строк аналогичны друг другу ...

Обратите внимание, что Oracle и Postgres оба используют TIMESTAMP в соответствии со стандартами, поэтому Microsoft разумно отказывается отстандартное использование отметки времени, чтобы избежать усложнения для разработчиков Oracle, пытающихся работать на SQL Server.

В любом случае, изменение с timestamp на rowversion только в названии.Это не влияет на поведение столбцов, использующих этот тип.Согласно документам MSDN для rowversion:

отметка времени является синонимом для типа данных версии строк и зависит от поведения синонимов типа данных.В выражениях DDL везде, где это возможно, используйте метку строки вместо метки времени.Для получения дополнительной информации см. Синонимы типов данных (Transact-SQL).

Если вы загляните в документы для Синонимы типов данных :

Все последующие функции метаданных, выполняемые для исходного объекта и любых производных объектов, будут сообщать базовый тип данных, а не синоним.Это происходит с операциями метаданных, такими как sp_help и другие системные хранимые процедуры, представления информационной схемы или различные операции метаданных API доступа к данным, которые сообщают типы данных столбцов таблицы или набора результатов.

Другими словами, к тому времени, когда SMO получает метаданные о таблице, она знает только об обращении строк.Это означает, что таблицы со столбцами типа rowversion возвращаются в SMO как Microsoft.SqlServer.Management.Smo.SqlDataType.Timestamp

API SMO никогда не догонял новое именование, используемое SQL Server.Но поскольку базовое поведение типа не изменилось, менять не нужно только имя, ваш клиентский код SMO.

Если ваш код отображает типы данных SQL Server, вы можете быть хорошим гражданином и изменить этот код так, чтобы он отображал «rowversion» вместо «timestamp».Но в противном случае ваш код вообще не нужно менять.Фактически, большинство клиентов SMO (, включая инструмент разработки таблиц Visual Studio! * ) даже не удосужились изменить свой пользовательский интерфейс, чтобы отразить новое наименование.Поскольку эти интерфейсы подключаются к перечислению под обложками, клиенты API SMO будут продолжать работать независимо от того, какой SQL Server вызывает тип в DDL.

Возможно, что в будущей версии API SMO также может быть добавлен синонимзначение для перечисления (например, Microsoft.SqlServer.Management.Smo.SqlDataType.RowVersion) с тем же базовым числовым значением, но, учитывая, что существующие клиенты не сломаны, это, вероятно, низкий приоритет для них.

1 голос
/ 17 марта 2010

Я не могу найти ничего, что указывает на то, что SqlDataType.Timestamp устарело. Предоставленная вами ссылка указывает на то, что «timestamp синтаксис» для rowversion устарел в T-SQL и что вместо него следует использовать rowversion, но администраторы библиотеки должны убедиться, что реализован правильный синтаксис в их продукте. Если случится так, что синтаксис метки времени будет фактически удален в будущей версии, то я уверен, что библиотека будет обновлена, и значение перечисления Timestamp все равно будет обратно совместимо для кода, который его использует. Поскольку они не предоставляют значение перечисления RowVersion, я бы просто использовал Timestamp.

...