Огляд типів CLR в SQL Server

За допомогою середовища NET Framework для SQL Server 2005 можна створити пять типів обєктів:

збережені процедури

■ функції

■ тригери

■ користувача типи

■ користувальницькі консолідації

Перші три є розширенням функціональності, доступної в попередніх версіях SQL Server за допомогою мови Т-SQL Двійники цих обєктів на мові Т-SQL залишилися доступними і у версії SQL Server 2005 були навіть покращені Наприкінці глави буде показано, коли варто використовувати типи CLR, а коли випробувані обєкти Т-SQL Решта два типи обєктів бази даних можуть бути створені виключно з використанням інтеграції CLR – це користувача типи і призначені для користувача консолідації Ці типи зявилися тільки у версії SQL Server 2005 У цьому розділі ми розглянемо загальні риси всіх пяти типів обєктів CLR SQL Server, а потім окремо зупинимося на характеристиках кожного з них

Атрибути типів NET інтеграції CLR

Раніше в цій главі була описана концепція домену програми середовища NET Framework У SQL Server домен програми визначається власником обєкта Власником обєкту є адміністратор бази даних Це значить, що доменом додатки, або базовим рівнем ізоляції програмного коду для інтеграції CLR, є всі обєкти, що належать одному і тому ж користувачеві або ролі в поточній базі даних

Додаткова Додаткова інформація про адміністраторів бази даних приведена в

інформація главі 40

Обєкти CLR в SQL Server завжди містять елементи метаданих, звані атрибутами Атрибути в середовищі NET використовуються для визначення призначення конкретної збірки, класу, методу, властивості, події або типу Наприклад, атрибут може бути використаний для визначення методу як CLS-сумісного Забігаючи вперед, в матеріал глав, присвячених Web-службам, можна сказати, що атрибут можна використовувати для маркування методу як Web-служби для обєктів, що перебувають за межами домену програми даного методу

Іменовані атрибути типів обєктів SQL Server більш коректно називають користувацькими атрибутами NET Framework Розробники інтеграції CLR в компанії Microsoft для інтерпретації цих атрибутів створили керовані розширення класу з простору імен System Attribute Користувальницькі атрибути обчислюються, коли тип імпортується в SQL Server і коли компілюється в середу виконання У обєктах SQL Server атрибути користувача визначають, який з пяти типів обєктів бази даних знаходиться в джерелі Користувальницькі атрибути також містять всю інформацію, необхідну SQL Server для імпорту обєкта при розгортанні Всі супутні атрибути користувача також обчислюються, коли для обєкта виконується інструкція T-SQL CREATE OBJECT після його імпорту

А Поміщайте блоки користувальницьких атрибутів безпосередньо перед програм-

вим кодом, до якого вони належать Блок користувальницьких атрибутів може уй бути також поміщений в початок файлу джерела, якщо задано модифікатор атрибути та, що вказує, в якому місці він повинен бути застосований Однак у цьому випадку Перевірено звязок між атрибутом і програмним кодом, до якого він належить, буде не такою очевидною для того, хто буде супроводжувати незнайомий код Шаблони обєктів SQL Server в Visual Studio 2005 завжди використовують перший метод Кожен з атрибутів полягає в пару кутових дужок (<>) і містить імя атрибута, за яким слідують обовязкові позиційні параметри, а потім необовязкові аргументи Атрибути обєктів SQL Server добре документовані

Нижче наводиться кілька прикладів користувальницьких атрибутів обєктів бази даних на мові VBNET в тому вигляді, в якому вони згенеровані шаблонами Visual Studio 2005 _

&ltSqlTrigger(Name:=&quotname&quotTarget:=&quotTable&quot, Event:=&quotFOR UPDATE&quot)&gt _ &ltSqlFunction()&gt _

&ltSerializable()&gt _

&ltSqlUserDefinedType(FormatNative)&gt _

&ltSqlMethod&gt _

&ltSqlFacet&gt _

&ltSerializable()&gt _

&ltSqlUserDefinedAggregate(FormatNative)&gt _

Як буде показано пізніше, установка списків аргументів може виявитися технічно трудомісткою Відзначимо, що атрибут Sql Procedure не має аргументів, і решту атрибутів типів SQL Server, якщо явно не задані, отримують значення за замовчуванням

У шаблоні для користувача типів і консолидаций також присутній атрибут Serializable (упорядочіваемость) Це не користувальницький, а системний атрибут він використовується під час виконання, а не завантаження Під упорядочіваемостью розуміється те, що обєкт, якому присвоюється цей атрибут, може записувати свій стан в базу даних або деяке інше постійне сховище, а потім зчитувати його звідти Упорядочіваемость є важливим атрибутом обєктів користувача типів і консолидаций, які повинні бути матеріалізовані і індексовані в базі даних Неупорядочівае-мі типи можуть бути не відсортовані, і їх використання в деяких випадках може виявитися неможливим Наприклад, неупорядочіваемие типи при використанні як обчислюваних стовпців бази даних можуть виявитися не проіндексованими, не впорядкований, що не згрупованими, непідвладними порівнянні і не живучими

Користувача типи можуть містити два члени для атрибутів: SqlMethod, який успадкований з обєкта SqlFunction, і SqlFacet, який використовується для опису повертається типу UDT

Користувальницькі атрибути обєктів SQL Server служать прототипом для конструктора класів цього типу Природно, це не єдиний спосіб, яким атрибути можуть використовуватися в середовищі NET Framework Згадаймо, що екземпляри класу створюються за допомогою методу new цього класу Наприклад, явний виклик методу створення нового екземпляра збереженої процедури ніколи не можна побачити в програмному коді користувача Однак коли створюється збережена процедура CLR, насправді CLR викликає конструктор класу кожен раз, коли ця процедура виконується

Загальні характеристики типів CLR в SQL Server

Насправді середу виконання гідна розгляду як загальна характеристика всіх пяти типів обєктів SQL Server У короткому огляді середовища NET Framework, з якого почалася справжня глава, була описана механіка середовища виконання CLR: вихідний програмний код попередньо компілюється на мову Microsoft Intermediate Language, незалежний від вихідної мови програмування Коли на даний код виконується посилання в середовищі виконання, компілятор JIT завантажує код MSIL в память у вигляді машинних інструкцій Самий звичайний код NET компілюється в інструкції, які може виконати операційна система Windows Інтеграція CLR увазі, що компілятор JIT читає код MSIL з таблиць бази даних, а не з файлів бібліотек Dll Цей компілятор створює інструкції, які SQL Server зберігає, розподіляє і обробляє в своєму просторі памяті Це дозволяє використовувати SQL Server не тільки для управління традиційним ядром, кешем даних і процедур і постійним джерелом проблем MemToLive, але і в якості повноцінної середовища виконання з інтенсивною обробкою даних

Витонченість рішення полягає в тому, що мало що відбувається при виклику компонента CLR, якщо сама середу виконання була активізована на сервері За замовчуванням інтеграція CLR відключена Щоб її включити, потрібно використовувати утиліту SQL Server Surface Area Configuration Tool або збережену процедуру T-SQL sp_conf igure:

exec sp_configure 1clr enabled, 1 reconfigure with override

Після включення середовища виконання CLR при виклику компонента інтеграції CLR при першому використанні він буде скомпільовано компілятором JIT в память Отримані машинні інструкції будуть доступні в памяті до тих пір, поки їх термін житті не закінчиться або не буде зупинений служба SQL Server При створенні першого примірника обєкта продуктивність дещо падає, що повязано з його компіляцією Після цього обєкт залишається в якості довічного елемента в ядрі, подібно будь вбудованої функції або типу даних

Було б наївно очікувати, щоб функції CLR могли зрівнятися по продуктивності з системними У той же час цілком реалістично, щоб функції CLR роботи з датою-часом у запитах, що обробляють безліч рядків, виконували набагато більше, ніж звичайні функції Т-SQL, використовувані в реченні WHERE Функції CLR не зможуть за швидкодією зрівнятися з вбудованими функціями, однак в контексті роботи з множинами даних по продуктивності вони все-таки набагато ближче до вбудованим, ніж до функцій T-SQL

Типи даних

Перед тим як досліджувати аргументи атрибутів та інші унікальні характеристики кожного з типів обєктів SQL Server, деяку увагу слід приділити однієї спільності між ними Це типи даних У манері, не менше неправдоподібною, ніж обслуговування податливою середовищем виконання SQL Server, заснованої на пріоритетах середовища виконання CLR, CLR також повинна звести воєдино рідні типи даних SQL Server і NET Framework Числові типи даних NET розглядаються як типи значень Типи значень зазвичай обслуговуються в області памяті стека виклику Символьні типи даних NET розглядаються як обєкти, на які є посилання Вони завжди використовують память, відокремлену від стека виклику, – вона ще відома під назвою купа керованого обєкта

Типи даних, успадковані від обєкта (а все в купі керованого обєкта успадковано від обєкта загального базового класу), вражають Такі типи містять члени, в тому числі властивості і методи, щоб зробити маніпуляції більш гнучкими, ніж примітивні типи даних значень Тип даних може бути переміщений або упакований з стека виклику в купу обєкта, якщо та визначена, або використаний, як якби він мав властивості, методи або поля Упаковка може бути явної і неявної

Іноді корисно переміщати примітив в керовану купу, щоб його поведе-Рада ня було схоже на поведінку обєкта Цей процес називається упаковкою У

Як класичний приклад бази даних, в якій може використовуватися упаковка, можна привести базу, в якій дати зберігаються у вигляді символьних літералів або в якій інтегральні значення повинні порівнюватися зі стовпцями, що містять символьні дані Водночас при порівнянні десятків тисяч рядків, заснованих на стовпці з типом посилання, в коді CLR продуктивність буде значно падати, якщо дані насправді мають тип значення При цьому не завжди цілком очевидно, що конкретна операція доступу до даних буде страждати від побічного ефекту упаковки Зазвичай питання, що стосуються упаковки, спливають після накопичення деякого досвіду роботи з інтеграцією CLR Тоді стає можливим ідентифікувати типи CLR, які з незясовних причин працюють повільніше інших типів CLR Щоб визначити, чи відбулася упаковка, можна подивитися на код MSIL Читачам, хто зацікавився цим питанням, буде цікаво дізнатися, що до складу Visual Studio 2005 входить утиліта дизассемблирования коду MSIL, яка називається ildasmexe

Робота з типами даних CLR має свої складнощі Однією з найбільших проблем є те, що типи даних NET Framework не розпізнали порожні значення У SQL Server значення null вказує на те, що атрибут суті не має певного значення таким чином, за замовчуванням в стандарті ANSI SQL таке значення, серед іншого, не може брати участь в операціях порівняння, а також у консолідації Примітивні типи даних в моделі програмування CLR позбавлені цієї концепції На щастя, існує колекція типів даних, доступна в просторі імен SystemDataSqlTypes, яка відображається безпосередньо на типи даних SQL Server Всі ці типи реалізують інтерфейс iNullable Це абсолютно не означає, що складнощі відображення типів даних між середовищем NET і SQL Server на цьому вичерпуються, але, тим не менш, цей простір імен може надати істотну допомогу Наприклад, якщо вам потрібно порівняти десяткове значення бази даних з точністю, що перевищує 28 знаків, з оперативним виміром, збереженим в десятковому значенні NET, необхідно буде перетворити тип decimal середовища NET в тип SqlDecimal, щоб уникнути ймовірних винятків при виконанні програми У подібному, але повністю протилежному сценарії значення SqlMoney може бути переповнене при порівнянні з десятковим значенням NET, яке прийшло від постачальника, відмінного від SQL Server

З точки зору програміста, при написанні тільки безпечного CAS-сумісного коду CLR-компоненти бази даних, що використовують типи з простору імен System Data SqlTypes, дозволять встановити більш прозорі відносини між компонентами інтеграції CLR і базою даних До того ж використання SqlTypes для даних, які відбуваються з бази даних, дозволять програмному коду виконуватися істотно швидше, оскільки типи даних NET Framework будуть неявно перетворюватися в SqlTypes середовищем виконання CLR при відправці в базу даних В іншому випадку для виконання операцій порівняння та присвоєння типи даних NET повинні перетворюватися явно У табл 271 наведені рідні типи даних SQL Server в порядку, в якому вони перераховані в просторі імен System Data SqlDBType, відповідному System Data SqlTypes, і еквівалентні їм вбудовані типи даних середовища NET Framework Окремі позиції будуть супроводжуватися коментарями автора

Таблиця 271 Типи даних SQL Server / CLR / NET

Рідний тип SQL Server

Тип інтеграції CLR в SQL Server

Тип CLR NET Framework

Коментарі

Bigint

Sqllnt64

Int64

Binary, Varbimary, Varbinary (max)

SqlBytes,

SqlBinary

Byte []

Bit

SqlBoolean

Boolean

Char, Nchar, Nvarchar, Nvarchar (max), sysname, Varchar, Varchar(max)

SqlChars,

SqlString

String, Char[]

У NET Framework всі символи належать таблиці Unicode

DateTime,

SmallDateTime

SqlDateTime

Datetime

Decimal, Numeric

SqlDecimal

Decimal

Різні діапазони значень: в SQL Server і SqlDecimal + /-КГ38 +1, а в NET дещо менше: + / – +7,9228162514264337593543950335 Е + 28

Float

SqlDouble

Double

У SQL мантиса масштабована за замовчуванням float (53)

Image

Byte [], Bitmap

Всі двійкові обєкти поставляються в базу даних і з неї в потоках як SQLBinary

Int

Sqllnt32

Int32

Money, Smallmoney

SqlMoney

Decimal

Діапазон SqlMoney становить 2 ~ 63 з точністю за однієї десятитисячної

Ntext, Text

Real

SqlSingle

Single

У SQL-92 еквівалентом типу real є float (24)

Smallint

Sqllntl6

Intl6

SQL_variant

Object

Table

ISqlResultSet

Timestamp

Byte []

Tinyint

SqlByte

Byte

Користувальницький тип

Збірка користувача типів має бути присутня на стороні клієнта, щоб додаток знало про них

Рідний тип SQL

Тип інтеграції

Тип CLR NET

Коментарі

Server

CLR в SQL Server

Framework

Uniqueidentifier

SqlGuid

Guid

XML

SqlXML

Джерело: Нільсен, Пол Microsoft SQL Server 2005 Біблія користувача : Пер з англ – М: ООО ІД Вільямс , 2008 – 1232 с : Ил – Парал тит англ

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*