Есть ли альтернатива Microsoft.SqlServer.Management.Smo.SqlDataType, включающая значение для RowVersion?
Microsoft.SqlServer.Management.Smo.SqlDataType
enum имеет значение для timestamp
тип но не rowversion
, Я ищу обновленную версию сборки или альтернативный тип enum, который ее поддерживает.
Существующее перечисление имеет значение для Timestamp
, но в соответствии с rowversion
документация, timestamp
"устарела и будет удалена в следующей версии". Я предпочитаю избегать использования устаревших вещей:)
2 ответа
Быстрый ответ:
Нет, вам не нужно использовать другой тип. 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 разумно отказалась от нестандартного использования timestamp, чтобы не усложнять работу разработчиков Oracle, пытающихся работать на SQL Server.
Во всяком случае, изменение от timestamp
в rowversion
только в названии. Это не влияет на поведение столбцов, использующих этот тип. Согласно документам MSDN для rowversion
:
метка времени является синонимом типа данных rowversion и зависит от поведения синонимов типа данных. В выражениях DDL везде, где это возможно, используйте метку строки вместо метки времени. Для получения дополнительной информации см. Синонимы типов данных (Transact-SQL).
Если вы покопаетесь в документации по синонимам типа данных:
Все последующие функции метаданных, выполняемые для исходного объекта и любых производных объектов, будут сообщать базовый тип данных, а не синоним. Это происходит с операциями метаданных, такими как sp_help и другие системные хранимые процедуры, представления информационной схемы или различные операции метаданных API доступа к данным, которые сообщают о типах данных столбцов таблицы или набора результатов.
Другими словами, к тому времени, когда SMO получает метаданные о таблице, она знает только об обращении строк. Это означает, что таблицы со столбцами типа rowversion возвращаются в SMO как Microsoft.SqlServer.Management.Smo.SqlDataType.Timestamp
SMO API никогда не догонял новое именование, используемое SQL Server. Но поскольку базовое поведение типа не изменилось, менять не нужно только имя, ваш клиентский код SMO.
Если ваш код отображает типы данных SQL Server, вы можете быть хорошим гражданином и изменить этот код так, чтобы он отображал "rowversion" вместо "timestamp". Но в противном случае ваш код не нужно менять вообще. На самом деле, большинство клиентов SMO ( включая инструмент для разработки таблиц в Visual Studio!) Даже не удосужились изменить свой пользовательский интерфейс, чтобы отразить новое наименование. Поскольку эти интерфейсы подключаются к перечислению под обложками, клиенты SMO API будут продолжать работать независимо от того, какой SQL Server вызывает тип в DDL.
Вполне возможно, что будущая версия SMO API также может добавить синонимическое значение в enum (например, Microsoft.SqlServer.Management.Smo.SqlDataType.RowVersion
) с тем же базовым числовым значением, но, учитывая, что существующие клиенты не сломаны, это, вероятно, низкий приоритет для них.
Я не могу найти ничего, что указывает на то, что SqlDataType.Timestamp
устарела. Предоставленная вами ссылка указывает на то, чтоtimestamp
синтаксис "для rowversion
устарел в T-SQL и что вы должны использовать rowversion
вместо этого, но администраторы библиотеки должны убедиться, что в их продукте реализован правильный синтаксис. Если случится так, что синтаксис метки времени будет фактически удален в будущей версии, то я уверен, что библиотека будет обновлена и Timestamp
Значение перечисления все равно будет обратно совместимо для кода, который его использует. Так как они не обеспечивают RowVersion
значение перечисления, я бы просто использовал Timestamp
,