Udostępnij za pośrednictwem


CREATE ASSEMBLY (Transact-SQL)

Applies to:SQL ServerAzure SQL Managed Instance

Tworzy moduł aplikacji zarządzanej zawierający metadane klasy i kod zarządzany jako obiekt w wystąpieniu programu SQL Server. Odwołując się do tego modułu, funkcje środowiska uruchomieniowego języka wspólnego (CLR), procedury składowane, wyzwalacze, agregacje zdefiniowane przez użytkownika i typy zdefiniowane przez użytkownika można utworzyć w bazie danych.

Transact-SQL konwencje składni

Syntax

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

Nazwa zestawu. The name must be unique within the database and a valid identifier.

AUTHORIZATION owner_name

Określa nazwę użytkownika lub roli jako właściciela zestawu. owner_name must either be the name of a role of which the current user is a member, or the current user must have IMPERSONATE permission on owner_name. Jeśli nie zostanie określony, własność zostanie nadana bieżącemu użytkownikowi.

<client_assembly_specifier>

Określa ścieżkę lokalną lub lokalizację sieci, w której znajduje się przekazany zestaw, a także nazwę pliku manifestu odpowiadającą zestawowi. <client_assembly_specifier> można wyrazić jako stały ciąg lub wyrażenie obliczane na stały ciąg ze zmiennymi. CREATE ASSEMBLY nie obsługuje ładowania zestawów wielomodułowych. Program SQL Server wyszukuje również wszystkie zależne zestawy tego zestawu w tej samej lokalizacji, a także przekazuje je z tym samym właścicielem co zestaw na poziomie głównym. Jeśli te zależne zestawy nie zostaną znalezione i nie zostaną jeszcze załadowane w bieżącej bazie danych, CREATE ASSEMBLY nie powiedzie się. Jeśli zestawy zależne są już załadowane w bieżącej bazie danych, właściciel tych zestawów musi być taki sam jak właściciel nowo utworzonego zestawu.

Important

Usługa Azure SQL Database i usługa Azure SQL Managed Instance nie obsługują tworzenia zestawu na podstawie pliku.

<client_assembly_specifier> Nie można określić, czy zalogowany użytkownik jest personifikowany.

<assembly_bits>

Lista wartości binarnych tworzących zestaw i jego zależne zestawy. Pierwsza wartość na liście jest uznawana za zestaw na poziomie głównym. Wartości odpowiadające zestawom zależnym można podać w dowolnej kolejności. Wszystkie wartości, które nie odpowiadają zależnościom zestawu głównego, są ignorowane.

Note

Ta opcja nie jest dostępna w zawartej bazie danych.

varbinary_literal

A varbinary literal.

varbinary_expression

An expression of type varbinary.

PERMISSION_SET { SAFE | EXTERNAL_ACCESS | NIEBEZPIECZNE }

Określa zestaw uprawnień dostępu do kodu, które są przyznawane zestawowi podczas uzyskiwania dostępu do programu SQL Server. Jeśli nie zostanie określona, SAFE zostanie zastosowana jako wartość domyślna.

Na PERMISSION_SET tę opcję ma wpływ konfiguracja serwera: clr strict security option. Po clr strict security włączeniu wszystkie zestawy są traktowane jako UNSAFE.

Zaleca się korzystanie z aplikacji SAFE. SAFE jest najbardziej restrykcyjnym zestawem uprawnień. Kod wykonywany przez zestaw z uprawnieniami SAFE nie może uzyskać dostępu do zewnętrznych zasobów systemowych, takich jak pliki, sieć, zmienne środowiskowe lub rejestr.

EXTERNAL_ACCESS umożliwia zestawom dostęp do niektórych zasobów systemu zewnętrznego, takich jak pliki, sieci, zmienne środowiskowe i rejestr.

UNSAFE umożliwia zestawom nieograniczony dostęp do zasobów, zarówno w ramach wystąpienia programu SQL Server, jak i poza nimi. Kod uruchomiony z poziomu UNSAFE zestawu może wywoływać kod niezarządzany.

SAFE to zalecane ustawienie uprawnień dla zestawów, które wykonują zadania obliczeniowe i zarządzania danymi bez uzyskiwania dostępu do zasobów poza wystąpieniem programu SQL Server.

Note

Opcje EXTERNAL_ACCESS i UNSAFE nie są dostępne w zawartej bazie danych.

Zalecamy używanie EXTERNAL_ACCESS zestawów, które uzyskują dostęp do zasobów poza wystąpieniem programu SQL Server. EXTERNAL_ACCESS Zestawy obejmują zabezpieczenia niezawodności i skalowalności zestawów SAFE , ale z punktu widzenia zabezpieczeń są podobne do UNSAFE zestawów. Kod w EXTERNAL_ACCESS zestawach jest domyślnie uruchamiany na koncie usługi programu SQL Server i uzyskuje dostęp do zasobów zewnętrznych na tym koncie, chyba że kod jawnie personifikuje obiekt wywołujący. W związku z tym uprawnienia do tworzenia EXTERNAL_ACCESS zestawów powinny mieć przyznane tylko identyfikatory logowania, które są zaufane do uruchamiania kodu na koncie usługi programu SQL Server. Aby uzyskać więcej informacji na temat personifikacji, zobacz Zabezpieczenia integracji środowiska CLR.

Określenie UNSAFE umożliwia kodowi w zestawie pełną swobodę wykonywania operacji w obszarze procesów programu SQL Server, które mogą potencjalnie naruszyć niezawodność programu SQL Server. UNSAFE zestawy mogą również potencjalnie odwrócić system zabezpieczeń programu SQL Server lub środowiska uruchomieniowego języka wspólnego. UNSAFE uprawnienia powinny być przyznawane tylko do wysoce zaufanych zestawów. Only members of the sysadmin fixed server role can create and alter UNSAFE assemblies.

For more information about assembly permission sets, see Design assemblies.

Zabezpieczenia dostępu kodu nie są już obsługiwane

CLR używa zabezpieczeń dostępu kodu (CAS) w programie .NET Framework, który nie jest już obsługiwany jako granica bezpieczeństwa. Zestaw CLR utworzony za pomocą PERMISSION_SET = SAFE może mieć dostęp do zasobów systemu zewnętrznego, wywołać kod niezarządzany i uzyskać uprawnienia administratora systemu. W programie SQL Server 2017 (14.x) i nowszych wersjach opcja sp_configure, clr strict security, zwiększa bezpieczeństwo zestawów CLR. clr strict security jest domyślnie włączona i traktuje zestawy SAFE i EXTERNAL_ACCESS tak, jakby zostały oznaczone UNSAFE. Opcja clr strict security może być wyłączona w celu zapewnienia zgodności z poprzednimi wersjami, ale nie jest zalecana.

Zalecamy podpisanie wszystkich zestawów certyfikatem lub kluczem asymetrycznym, z odpowiadającym loginem, któremu udzielono uprawnienia UNSAFE ASSEMBLY w bazie danych master. Administratorzy programu SQL Server mogą również dodawać zestawy do listy zestawów, którym aparat bazy danych powinien ufać. For more information, see sys.sp_add_trusted_assembly.

Remarks

CREATE ASSEMBLY przekazuje zestaw, który został wcześniej skompilowany jako plik .dll z kodu zarządzanego do użycia w wystąpieniu programu SQL Server.

Po włączeniu opcji PERMISSION_SET w instrukcjach CREATE ASSEMBLY i ALTER ASSEMBLY jest ona pomijana podczas wykonywania, ale opcje PERMISSION_SET są zachowane w metadanych. Ignorowanie opcji minimalizuje niezgodność istniejących instrukcji kodu.

Program SQL Server nie zezwala na rejestrowanie różnych wersji zestawu o tej samej nazwie, kulturze i kluczu publicznym.

Podczas próby uzyskania dostępu do zestawu określonego w <client_assembly_specifier>programie program SQL Server personifikuje kontekst zabezpieczeń bieżącego identyfikatora logowania systemu Windows. Jeśli <client_assembly_specifier> określa lokalizację sieciową (ścieżkę UNC), personifikacja bieżącego identyfikatora logowania nie jest przenoszona do lokalizacji sieciowej z powodu ograniczeń delegowania. W takim przypadku dostęp jest uzyskiwany przy użyciu kontekstu zabezpieczeń konta usługi programu SQL Server. Aby uzyskać więcej informacji, zobacz Credentials (Aparat bazy danych).

Besides the root assembly specified by assembly_name, SQL Server tries to upload any assemblies that are referenced by the root assembly being uploaded. Jeśli zestaw, do których odwołuje się odwołanie, został już przekazany do bazy danych z powodu wcześniejszej CREATE ASSEMBLY instrukcji, ten zestaw nie jest przekazywany, ale jest dostępny dla zestawu głównego. Jeśli zestaw zależny nie został wcześniej przekazany, ale program SQL Server nie może zlokalizować jego pliku manifestu w katalogu źródłowym, CREATE ASSEMBLY zwraca błąd.

Jeśli jakiekolwiek zależne zestawy, do których odwołuje się zestaw główny, nie znajdują się jeszcze w bazie danych i są niejawnie ładowane razem z zestawem głównym, mają ten sam zestaw uprawnień co zestaw poziomu głównego. Jeśli zestawy zależne muszą zostać utworzone przy użyciu innego zestawu uprawnień niż zestaw na poziomie głównym, należy je przekazać jawnie przed zestawem na poziomie głównym z odpowiednim zestawem uprawnień.

Assembly Validation

Program SQL Server skanuje pliki binarne zestawu przekazane przez instrukcję w CREATE ASSEMBLY celu zagwarantowania następujących kontroli:

  • Plik binarny zestawu jest poprawnie sformułowany z prawidłowymi metadanymi i segmentami kodu, a segmenty kodu mają prawidłowe instrukcje języka Microsoft Intermediate Language (MSIL).

  • Zestaw zestawów systemowych, do których się odwołuje, jest jednym z następujących obsługiwanych zestawów w programie SQL Server: Microsoft.VisualBasic.dll, System.Xml.dllSystem.Data.dllMicrosoft.VisualC.dllCustomMarshallers.dllSystem.dllmscorlib.dllSystem.Web.Services.dllSystem.Data.SqlXml.dllSystem.Security.dllSystem.Core.dlli .System.Xml.Linq.dll Można odwoływać się do innych zestawów systemowych, ale muszą być jawnie zarejestrowane w bazie danych.

  • W przypadku zestawów utworzonych przy użyciu zestawów SAFE uprawnień lub EXTERNAL ACCESS :

    • Kod zestawu powinien być bezpieczny dla typu. Bezpieczeństwo typów jest ustanawiane przez uruchomienie weryfikatora środowiska uruchomieniowego języka wspólnego względem zestawu.

    • Zestaw nie powinien zawierać żadnych składowych danych statycznych w klasach, chyba że są one oznaczone jako tylko do odczytu.

    • Klasy w zestawie nie mogą zawierać metod finalizatora.

    • Klasy lub metody zestawu powinny być adnotacjami tylko z dozwolonymi atrybutami kodu. Aby uzyskać więcej informacji, zobacz Integracja środowiska CLR: atrybuty niestandardowe dla procedur CLR.

Oprócz poprzednich testów, które są wykonywane podczas CREATE ASSEMBLY wykonywania, istnieją dodatkowe kontrole wykonywane w czasie wykonywania kodu w zestawie:

  • Wywoływanie niektórych interfejsów API programu .NET Framework wymagających określonego uprawnienia dostępu do kodu może zakończyć się niepowodzeniem, jeśli zestaw uprawnień zestawu nie zawiera tego uprawnienia.

  • W przypadku SAFE zestawów i EXTERNAL_ACCESS wszelkie próby wywołania interfejsów API programu .NET Framework, które są oznaczone określonymi atrybutami HostProtectionAttributes, kończą się niepowodzeniem.

For more information, see Design assemblies.

Permissions

Wymaga CREATE ASSEMBLY uprawnienia.

Jeśli PERMISSION_SET = EXTERNAL_ACCESS zostanie określony, wymaga EXTERNAL ACCESS ASSEMBLY uprawnień na serwerze. Jeśli PERMISSION_SET = UNSAFE zostanie określony, wymaga UNSAFE ASSEMBLY uprawnień na serwerze.

Użytkownik musi być właścicielem wszystkich zestawów, do których odwołuje się zestaw, który ma zostać przekazany, jeśli zestawy już istnieją w bazie danych. To upload an assembly by using a file path, the current user must be a Windows authenticated login or a member of the sysadmin fixed server role. Identyfikator logowania systemu Windows użytkownika, który wykonuje CREATE ASSEMBLY , musi mieć uprawnienia do odczytu w udziale i pliki ładowane w instrukcji .

Uprawnienia ze ścisłymi zabezpieczeniami środowiska CLR

Następujące uprawnienia wymagane do utworzenia zestawu CLR po CLR strict security włączeniu:

  • Użytkownik musi mieć CREATE ASSEMBLY uprawnienie
  • A jeden z następujących warunków musi być również spełniony:
    • Zbiór jest podpisany przy użyciu certyfikatu lub klucza asymetrycznego, który ma odpowiadające dane logowania z UNSAFE ASSEMBLY uprawnieniem na serwerze. Zalecane jest podpisywanie zestawu.
    • Baza danych ma właściwość ustawioną TRUSTWORTHY na ON, a baza danych jest własnością loginu, który posiada UNSAFE ASSEMBLY uprawnienia na serwerze. Ta opcja nie jest zalecana.

For more information about assembly permission sets, see Design assemblies.

Examples

A. Tworzenie zestawu na podstawie biblioteki DLL

W poniższym przykładzie przyjęto założenie, że przykłady aparatu bazy danych programu SQL Server są instalowane w domyślnej lokalizacji komputera lokalnego, a HelloWorld.csproj przykładowa aplikacja jest kompilowana. Aby uzyskać więcej informacji, zobacz Hello World Sample (Przykład 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

Usługa Azure SQL Database nie obsługuje tworzenia zestawu na podstawie pliku.

B. Tworzenie zestawu na podstawie bitów zestawów

Zastąp przykładowe bity (które nie są kompletne lub prawidłowe) bitami zestawu.

CREATE ASSEMBLY HelloWorld
    FROM 0x4D5A900000000000
WITH PERMISSION_SET = SAFE;