CREATE ASSEMBLY (Transact-SQL)
S’applique à : SQL Server Azure SQL Managed Instance
Crée un module d'application managée qui contient des métadonnées de classe et du code managé sous forme d'objet dans une instance de SQL Server. En référençant ce module, il est possible de créer dans la base de données des fonctions CLR (Common Language Runtime), des procédures stockées, des déclencheurs, des agrégats et des types définis par l'utilisateur.
Conventions de la syntaxe Transact-SQL
Syntaxe
CREATE ASSEMBLY assembly_name
[ AUTHORIZATION owner_name ]
FROM { <client_assembly_specifier> | <assembly_bits> [ , ...n ] }
[ WITH PERMISSION_SET = { SAFE | EXTERNAL_ACCESS | UNSAFE } ]
[ ; ]
<client_assembly_specifier> ::=
'[ \\computer_name\ ] share_name\ [ path\ ] manifest_file_name'
| '[ local_path\ ] manifest_file_name'
<assembly_bits> ::=
{ varbinary_literal | varbinary_expression }
Arguments
assembly_name
Nom de l'assembly. Ce nom doit être unique dans la base de données et correspondre à un identificateur valide.
AUTHORIZATION owner_name
Spécifie le nom d'un utilisateur ou d'un rôle comme propriétaire de l'assembly. owner_name doit être le nom d’un rôle dont l’utilisateur actuel est membre, ou l’utilisateur actuel doit avoir IMPERSONATE
l’autorisation sur owner_name. En l'absence de spécification, la propriété revient à l'utilisateur actuel.
<client_assembly_specifier>
Spécifie le chemin d'accès local ou l'emplacement sur le réseau où se trouve l'assembly en cours de téléchargement, et également le nom du fichier de manifeste qui correspond à l'assembly. <client_assembly_specifier>
peut s’exprimer sous forme de chaîne de caractères fixe ou d’une expression qui correspond à une chaîne de caractères fixe, avec des variables. CREATE ASSEMBLY
ne prend pas en charge le chargement d’assemblys multimodule. SQL Server recherche au même emplacement les assemblys dépendants de cet assembly et les télécharge avec le même propriétaire en tant qu'assembly au niveau racine. Si ces assemblys dépendants ne sont pas trouvés et qu’ils ne sont pas déjà chargés dans la base de données active, CREATE ASSEMBLY
échoue. Si les assemblys dépendants sont déjà chargés dans la base de données active, leur propriétaire doit être identique à celui de l'assembly créé.
Important
Azure SQL Database & Azure SQL Managed Instance ne prend pas en charge la création d’un assembly à partir d’un fichier.
<client_assembly_specifier>
ne peut pas être spécifié si l’utilisateur connecté est emprunt d’identité.
<assembly_bits>
Liste des valeurs binaires qui composent l’assembly et ses assemblys dépendants. La première valeur de la liste est considérée comme l'assembly de niveau racine. Les valeurs correspondant aux assemblys dépendants peuvent être fournies dans n'importe quel ordre. Toutes les valeurs qui ne correspondent pas aux dépendances de l’assembly racine sont ignorées.
Remarque
Cette option n'est pas disponible dans une base de données autonome.
varbinary_literal
Littéral varbinary .
varbinary_expression
Expression de type varbinary.
PERMISSION_SET { SAFE | EXTERNAL_ACCESS | UNSAFE }
Spécifie un ensemble d’autorisations d’accès au code qui sont accordées à l’assembly lorsqu’ils sont accessibles par SQL Server. S’il n’est pas spécifié, SAFE
est appliqué comme valeur par défaut.
L’option PERMISSION_SET
est affectée par la configuration du serveur : option de sécurité clr strict. Quand clr strict security
est activé, tous les assemblys sont traités en tant que UNSAFE
.
Nous vous recommandons d’utiliser SAFE
. SAFE
est le jeu d'autorisations le plus restrictif. Le code exécuté par un assembly disposant SAFE
d’autorisations ne peut pas accéder aux ressources système externes telles que les fichiers, le réseau, les variables d’environnement ou le Registre.
EXTERNAL_ACCESS
permet aux assemblys d’accéder à certaines ressources système externes telles que les fichiers, les réseaux, les variables environnementales et le Registre.
UNSAFE
permet aux assemblys d’accéder sans restriction aux ressources, tant au sein qu’en dehors d’une instance de SQL Server. Le code exécuté à partir d’un UNSAFE
assembly peut appeler du code non managé.
SAFE
est le paramètre d’autorisation recommandé pour les assemblys qui effectuent des tâches de calcul et de gestion des données sans accéder aux ressources en dehors d’une instance de SQL Server.
Remarque
Les EXTERNAL_ACCESS
options et UNSAFE
les options ne sont pas disponibles dans une base de données autonome.
Nous vous recommandons d’utiliser EXTERNAL_ACCESS
pour les assemblys qui accèdent aux ressources en dehors d’une instance de SQL Server. EXTERNAL_ACCESS
Les assemblys incluent la fiabilité et les protections d’extensibilité des assemblys, mais du point de vue de SAFE
la sécurité, sont similaires aux UNSAFE
assemblys. Le code dans EXTERNAL_ACCESS
les assemblys s’exécute par défaut sous le compte de service SQL Server et accède aux ressources externes sous ce compte, sauf si le code emprunte explicitement l’identité de l’appelant. Par conséquent, l’autorisation de créer EXTERNAL_ACCESS
des assemblys doit être accordée uniquement aux connexions approuvées pour exécuter du code sous le compte de service SQL Server. Pour plus d’informations sur l’emprunt d’identité, consultez Sécurité de l’intégration du CLR.
La spécification UNSAFE
permet au code dans l’assembly d’effectuer des opérations dans l’espace de processus SQL Server qui peuvent compromettre potentiellement la robustesse de SQL Server. UNSAFE
Les assemblys peuvent également potentiellement subvertir le système de sécurité de SQL Server ou du Common Language Runtime. UNSAFE
les autorisations doivent être accordées uniquement aux assemblys hautement approuvés. Seuls les membres du rôle serveur fixe sysadmin peuvent créer et modifier UNSAFE
des assemblys.
Pour plus d’informations sur les jeux d’autorisations d’assembly, consultez Conception d’assemblys.
La sécurité d’accès du code n’est plus prise en charge
CLR utilise la sécurité d’accès du code (CAS) dans le .NET Framework, qui n’est plus pris en charge comme limite de sécurité. Un assembly CLR créé avec PERMISSION_SET = SAFE
pourrait être en mesure d’accéder à des ressources système externes, d’appeler du code non managé et d’acquérir des privilèges sysadmin. Dans SQL Server 2017 (14.x) et versions ultérieures, l’option sp_configure
,sécurité clr stricte, améliore la sécurité des assemblys CLR. clr strict security
est activée par défaut et traite les assemblys SAFE
et EXTERNAL_ACCESS
comme s’ils étaient marqués UNSAFE
. L’option clr strict security
peut être désactivée pour assurer une compatibilité descendante, mais cela n’est pas recommandé.
Nous recommandons que tous les assemblys soient signés par un certificat ou une clé asymétrique avec une connexion correspondante à laquelle a été accordée l’autorisation UNSAFE ASSEMBLY
dans la base de données master
. Les administrateurs SQL Server peuvent également ajouter des assemblys à une liste d’assemblys, que le moteur de base de données doit approuver. Pour plus d’informations, consultez sys.sp_add_trusted_assembly.
Notes
CREATE ASSEMBLY
charge un assembly qui a été précédemment compilé en tant que fichier .dll à partir du code managé pour une utilisation à l’intérieur d’une instance de SQL Server.
Quand elle est activée, l’option PERMISSION_SET
dans les instructions CREATE ASSEMBLY
et ALTER ASSEMBLY
est ignorée au moment de l’exécution, mais les options PERMISSION_SET
sont conservées dans les métadonnées. Ignorer l’option réduit la rupture des instructions de code existantes.
SQL Server n’autorise pas l’inscription de différentes versions d’un assembly portant le même nom, la même culture et la clé publique.
Lorsque vous tentez d’accéder à l’assembly spécifié dans <client_assembly_specifier>
, SQL Server emprunte l’identité du contexte de sécurité de la connexion Windows actuelle. Si <client_assembly_specifier>
elle spécifie un emplacement réseau (chemin UNC), l’emprunt d’identité de la connexion actuelle n’est pas transféré vers l’emplacement réseau en raison des limitations de délégation. Dans ce cas, l’accès a lieu en utilisant le contexte de sécurité du compte de service SQL Server. Pour plus d’informations, consultez Informations d’identification (moteur de base de données).
Outre l’assembly racine spécifié par assembly_name, SQL Server tente de charger les assemblys référencés par l’assembly racine en cours de chargement. Si un assembly référencé est déjà chargé dans la base de données en raison d’une instruction antérieure CREATE ASSEMBLY
, cet assembly n’est pas chargé, mais est disponible pour l’assembly racine. Si un assembly dépendant n’a pas été précédemment chargé, mais QUE SQL Server ne peut pas localiser son fichier manifeste dans le répertoire source, CREATE ASSEMBLY
retourne une erreur.
Si les assemblys dépendants référencés par l’assembly racine ne sont pas déjà dans la base de données et sont implicitement chargés avec l’assembly racine, ils ont le même jeu d’autorisations que l’assembly de niveau racine. Si les assemblys dépendants doivent être créés en utilisant un autre ensemble d'autorisations que celui de l'assembly racine, ils doivent être téléchargés explicitement avant l'assembly de niveau racine avec l'ensemble d'autorisations approprié.
Validation des assemblys
SQL Server analyse les fichiers binaires d’assembly chargés par l’instruction CREATE ASSEMBLY
pour garantir les vérifications suivantes :
Le fichier assembly binaire se compose de métadonnées et de segments de code valides et ces segments de code contiennent des instructions MSIL (Microsoft Intermediate language) valides.
L’ensemble d’assemblys système qu’il référence est l’un des assemblys pris en charge suivants dans SQL Server : , , , , ,
System.Xml.dll
, ,Microsoft.VisualC.dll
,System.Core.dll
System.Data.SqlXml.dll
System.Web.Services.dll
CustomMarshallers.dll
System.Security.dll
et .System.Xml.Linq.dll
System.dll
System.Data.dll
mscorlib.dll
Microsoft.VisualBasic.dll
D'autres assemblys système peuvent être référencés, mais ils doivent être inscrits explicitement dans la base de données.Pour les assemblys créés à l’aide
SAFE
ouEXTERNAL ACCESS
aux jeux d’autorisations :Le type du code assembly doit être sécurisé. La sécurité s'établit en exécutant l'outil de vérification CLR (Common Language Runtime) sur l'assembly.
L’assembly ne doit pas contenir de membres de données statiques dans ses classes, sauf s’ils sont marqués en lecture seule.
Les classes de l’assembly ne peuvent pas contenir de méthodes finaliseurs.
Les classes ou méthodes de l'assembly doivent être annotées uniquement avec des attributs de code autorisés. Pour plus d’informations, consultez intégration clR : attributs personnalisés pour les routines CLR.
Outre les vérifications précédentes effectuées lors CREATE ASSEMBLY
de l’exécution, il existe des vérifications supplémentaires effectuées au moment de l’exécution du code dans l’assembly :
L’appel de certaines API .NET Framework qui nécessitent une autorisation d’accès au code spécifique peut échouer si le jeu d’autorisations de l’assembly n’inclut pas cette autorisation.
Pour
SAFE
etEXTERNAL_ACCESS
les assemblys, toute tentative d’appel des API .NET Framework annotées avec certains HostProtectionAttributes échoue.
Pour plus d’informations, consultez Conception d’assemblys.
autorisations
Nécessite l'autorisation CREATE ASSEMBLY
.
Si PERMISSION_SET = EXTERNAL_ACCESS
elle est spécifiée, nécessite EXTERNAL ACCESS ASSEMBLY
une autorisation sur le serveur. Si PERMISSION_SET = UNSAFE
elle est spécifiée, nécessite UNSAFE ASSEMBLY
une autorisation sur le serveur.
L'utilisateur doit être propriétaire des assemblys référencés par l'assembly qui doivent être téléchargés s'ils existent déjà dans la base de données. Pour charger un assembly à l’aide d’un chemin de fichier, l’utilisateur actuel doit utiliser une connexion Windows authentifiée ou être membre du rôle serveur fixe sysadmin. La connexion Windows de l’utilisateur qui s’exécute doit disposer d’une autorisation de lecture sur le partage et les fichiers chargés CREATE ASSEMBLY
dans l’instruction.
Autorisations avec sécurité CLR stricte
Les autorisations suivantes sont requises pour créer un assembly CLR quand CLR strict security
est activée :
- L’utilisateur doit avoir l’autorisation
CREATE ASSEMBLY
- Et une des conditions suivantes doit également être remplie :
- L’assembly est signé avec un certificat ou une clé asymétrique qui a une connexion correspondante avec l’autorisation
UNSAFE ASSEMBLY
sur le serveur. Signer l’assembly est recommandé. - La base de données a la propriété
TRUSTWORTHY
définie surON
, et elle est détenue par une connexion qui a l’autorisationUNSAFE ASSEMBLY
sur le serveur. Cette option n’est pas recommandée.
- L’assembly est signé avec un certificat ou une clé asymétrique qui a une connexion correspondante avec l’autorisation
Pour plus d’informations sur les jeux d’autorisations d’assembly, consultez Conception d’assemblys.
Exemples
R. Créer un assembly à partir d’une DLL
L’exemple suivant suppose que les exemples sql Server Moteur de base de données sont installés à l’emplacement par défaut de l’ordinateur local et que l’exemple HelloWorld.csproj
d’application est compilé. Pour plus d’informations, consultez Exemple Hello World.
CREATE ASSEMBLY HelloWorld
FROM '<system_drive>:\Program Files\Microsoft SQL Server\100\Samples\HelloWorld\CS\HelloWorld\bin\debug\HelloWorld.dll'
WITH PERMISSION_SET = SAFE;
Important
Azure SQL Database ne prend pas en charge la création d’un assembly à partir d’un fichier.
B. Créer un assembly à partir de bits d’assembly
Remplacez les exemples de bits (qui ne sont pas complets ou valides) par vos bits d’assembly.
CREATE ASSEMBLY HelloWorld
FROM 0x4D5A900000000000
WITH PERMISSION_SET = SAFE;
Contenu connexe
- ALTER ASSEMBLY (Transact-SQL)
- DROP ASSEMBLY (Transact-SQL)
- CREATE FUNCTION (Transact-SQL)
- CREATE PROCEDURE (Transact-SQL)
- CREATE TRIGGER (Transact-SQL)
- CREATE TYPE (Transact-SQL)
- CREATE AGGREGATE (Transact-SQL)
- EVENTDATA (Transact-SQL)
- Scénarios et exemples d'utilisation pour l'intégration du CLR (Common Language Runtime)