Атрибуты проектов баз данных SQL в среде CLR и объектов баз данных
К каждому проекту SQL Server и ко всем его объектам должен быть применен атрибут. Интеграцию SQL Server со средой CLR (SQL CLR) можно использовать для создания объектов следующих типов:
Проект / Файл |
Атрибут, который должен быть применен |
---|---|
Проект |
SqlAssemblyAttribute |
Aggregate |
SqlUserDefinedAggregateAttribute |
Хранимая процедура |
SqlProcedureAttribute |
Trigger |
SqlTriggerAttribute |
Пользовательская функция. |
SqlFunctionAttribute |
Пользовательский тип данных. |
SqlUserDefinedTypeAttribute |
Атрибут SqlAssembly.
Этот атрибут должен применяться ко всем сборкам, которые будут развернуты в базе данных SQL Server. Этот атрибут не имеет параметров. Он добавляется в файл AssemblyInfo при создании проекта SQL Server.
SqlUserDefinedAggregate Attribute
Этот атрибут должен применяться к пользовательским агрегатным объектам. Этот атрибут имеет два свойства: FormatandMaxByteSize.
Format
Обязательный. Формат хранения агрегатной функции. Ниже приведены поддерживаемые форматы.Native — указывает, что SQL Server использует эффективное представление в машинном коде на диске. Этот формат является наиболее компактным и обеспечивает максимальную производительность. Требования для этого формата таковы:
Атрибут StructLayout.LayoutKindSequential должен быть применен к агрегатной функции.
Все поля агрегатной функции должны быть непреобразуемыми, т. е. они должны иметь общее представление в управляемой и в неуправляемой памяти и не требовать специальной обработки маршаллером взаимодействия.
Статистическая функция не должна определять значение для MaxByteSize.
Статистическая функция не должна иметь полей [NonSerialized].
Поля не должны быть помечены как явный макет.
UserDefined — указывает, что пользователь имеет полный контроль над двоичным форматом. Требования для этого формата таковы:
Статистическая функция должна реализовывать IBinarySerialize.
Статистическая функция должна определять значение для MaxByteSize.
MaxByteSize
Максимальный размер экземпляра этой агрегатной функции в байтах. Требуется, только если для свойства UserDefined задано значение Format. Не требуется указывать, если для свойства Native задано значение Format.
Этот пример указывает, что для свойства Native значением является Format агрегата.
<SqlUserDefinedAggregate(Format.Native)>
Public Class SampleAggregate
'...
End Class
[SqlUserDefinedAggregate(Format.Native)]
public class SampleAggregate
{
//...
}
Атрибут SqlProcedure
Этот атрибут должен применяться к объектам хранимых процедур. Этот атрибут имеет следующие параметры:
- Name — необязательный. Задает имя, которое используется на сервере SQL Server для обращения к хранимой процедуре.
Этот пример устанавливает, что к сохраненной процедуре обращаются по имени sp_sqlName.
Partial Public Class StoredProcedures
<SqlProcedure(Name:="sp_sqlName")>
Public Shared Sub SampleProcedure(ByVal s As SqlString)
'...
End Sub
End Class
public partial class StoredProcedures
{
[SqlProcedure(Name="sp_sqlName")]
public static void SampleProcedure(SqlString s)
{
//...
}
}
Атрибут SqlTrigger
Этот атрибут должен быть применен к объектам триггеров. Этот атрибут имеет следующие параметры:
Name — необязательный. Определяет имя, которое используется на сервере SQL Server для ссылок на триггер.
Target — обязательный. Указывает целевой объект, к которому применяется этот триггер. Тип целевого объекта зависит от типа создаваемого целевого объекта. Можно создавать триггеры DML, DDL или LOGON. Наиболее распространенный тип триггера применяется к таблицам.
Event — обязательный. Указывает действие, которое активирует триггер.
В этом примере триггер активируется путем обновления существующих данных (UPDATE) в таблице authors.
Partial Public Class Triggers
<SqlTrigger(Target:="authors", Event:="FOR UPDATE")>
Public Shared Sub AuthorsUpdateTrigger()
'...
End Sub
End Class
public partial class Triggers
{
[SqlTrigger(Target="authors", Event="FOR UPDATE")]
public static void AuthorsUpdateTrigger()
{
//...
}
}
В этом примере к триггеру обращаются по имени trig_onpubinsert. Триггер активизирован путем добавления новых данных (INSERT) в таблицу publishers.
Partial Public Class Triggers
<SqlTrigger(Name:="trig_onpubinsert", Target:="publishers", Event:="FOR INSERT")>
Public Shared Sub PublishersInsertTrigger()
'...
End Sub
End Class
public partial class Triggers
{
[SqlTrigger(Name="trig_onpubinsert", Target="publishers", Event="FOR INSERT")]
public static void PublishersInsertTrigger()
{
//...
}
}
Атрибут SqlFunction
Этот атрибут должен быть применен к объектам пользовательских функций, которые возвращают скалярное значение или таблицу. Этот атрибут имеет следующие параметры:
Name — необязательный. Указывает имя, используемое на сервере SQL Server для обращения к пользовательской функции.
Примечание
Для функций, возвращающих табличное значение, необходимо указать значение для свойства TableDefinition, которое содержит представление определения возвращаемой таблицы в Transact-SQL.
В этом примере к пользовательской функции обращаются по имени sp_scalarFunc.
Partial Public Class UserDefinedFunctions
<SqlFunction(Name:="sp_scalarFunc")>
Public Shared Function SampleScalarFunction(ByVal s As SqlString) As SqlString
'...
Return ""
End Function
End Class
public partial class UserDefinedFunctions
{
[SqlFunction(Name="sp_scalarFunc")]
public static SqlString SampleScalarFunction(SqlString s)
{
//...
return "";
}
}
В этом примере к пользовательской функции обращаются по имени sp_tableFunc. Свойство TableDefinition имеет значение letter nchar(1).
Partial Public Class UserDefinedFunctions
<SqlFunction(Name:="sp_tableFunc", TableDefinition:="letter nchar(1)")>
Public Shared Function SampleTableFunction(ByVal s As SqlString) As IEnumerable
'...
Return New Char(2) {"a"c, "b"c, "c"c}
End Function
End Class
public partial class UserDefinedFunctions
{
[SqlFunction(Name="sp_tableFunc", TableDefinition="letter nchar(1)")]
public static IEnumerable SampleTableFunction(SqlString s)
{
//...
return new ArrayList(new char[3] {'a', 'b', 'c'});
}
}
Атрибут SqlUserDefinedType
Этот атрибут должен применяться к объектам пользовательских типов. Этот атрибут имеет четыре свойства: Format, MaxByteSize, IsFixedLength и IsByteOrdered.
Format
Обязательный. Формат хранения пользовательского типа. Ниже приведены поддерживаемые форматы.Native — указывает, что SQL Server использует эффективное представление в машинном коде на диске. Это параметр наибольшей компактности, обычно обладающий максимальной производительностью. Требования для этого формата таковы:
Атрибут StructLayout.LayoutKindSequential должен применяться к типу.
Все поля пользовательского типа должны быть непреобразуемыми, т. е. они должны иметь общее представление в управляемой/неуправляемой памяти и не требовать специальной обработки маршаллером взаимодействия.
Тип не должен определять значение для MaxByteSize.
Тип не должен иметь полей [NonSerialized].
Поля не должны быть помечены как явный макет.
UserDefined — указывает, что пользователь имеет полный контроль над двоичным форматом. Требования для этого формата таковы:
Тип должен реализовывать IBinarySerialize.
Тип должен определять значение для MaxByteSize.
MaxByteSize
Обязательный. Максимальный размер экземпляра этого типа в байтах.IsFixedLength
Необязательно. Указывает, имеют ли все экземпляры типа одинаковую длину. Значение по умолчанию — false.IsByteOrdered
Необязательно. Указывает, упорядочено ли двоичное представление этого типа, то есть может ли оно использоваться для сравнения экземпляров данного типа. Значение по умолчанию — false.
Этот пример устанавливает, что Format пользовательского типа является SerializedDataWithMetadata, а MaxByteSize равен 8000 байт.
<SqlUserDefinedType(Format.Native, MaxByteSize:=8000)>
Public Class SampleType
'...
End Class
[SqlUserDefinedType(Format.Native, MaxByteSize=8000)]
public class SampleType
{
//...
}
См. также
Задачи
Практическое руководство. Создание и запуск триггера SQL Server при помощи интеграции со средой CLR
Пошаговое руководство. Создание хранимой процедуры в управляемом коде
Практическое руководство. Отладка хранимой процедуры SQL CLR
Основные понятия
Введение в интеграцию SQL Server со средой CLR (ADO.NET)
Преимущества использования управляемого кода для создания объектов баз данных