Bagikan melalui


BUAT RAKITAN (Transact-SQL)

Berlaku untuk: SQL Server Azure SQL Managed Instance

Membuat modul aplikasi terkelola yang berisi metadata kelas dan kode terkelola sebagai objek dalam instans SQL Server. Dengan mereferensikan modul ini, fungsi runtime bahasa umum (CLR), prosedur tersimpan, pemicu, agregat yang ditentukan pengguna, dan jenis yang ditentukan pengguna dapat dibuat dalam database.

Konvensi sintaks transact-SQL

Sintaks

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 }

Argumen

assembly_name

Nama assembly. Nama harus unik dalam database dan pengidentifikasi yang valid.

owner_name OTORISASI

Menentukan nama pengguna atau peran sebagai pemilik rakitan. owner_name harus menjadi nama peran di mana pengguna saat ini adalah anggota, atau pengguna saat ini harus memiliki IMPERSONATE izin pada owner_name. Jika tidak ditentukan, kepemilikan diberikan kepada pengguna saat ini.

<client_assembly_specifier>

Menentukan jalur lokal atau lokasi jaringan tempat assembly yang sedang diunggah berada, dan juga nama file manifes yang sesuai dengan assembly. <client_assembly_specifier> dapat dinyatakan sebagai string tetap atau ekspresi yang mengevaluasi ke string tetap, dengan variabel. CREATE ASSEMBLY tidak mendukung pemuatan rakitan multimodule. SQL Server juga mencari rakitan dependen rakitan ini di lokasi yang sama dan juga mengunggahnya dengan pemilik yang sama dengan rakitan tingkat akar. Jika rakitan dependen ini tidak ditemukan dan belum dimuat dalam database saat ini, CREATE ASSEMBLY gagal. Jika rakitan dependen sudah dimuat dalam database saat ini, pemilik rakitan tersebut harus sama dengan pemilik rakitan yang baru dibuat.

Penting

Azure SQL Database & Azure SQL Managed Instance tidak mendukung pembuatan rakitan dari file.

<client_assembly_specifier> tidak dapat ditentukan jika pengguna yang masuk sedang ditiru.

<assembly_bits>

Daftar nilai biner yang membentuk rakitan dan rakitan dependennya. Nilai pertama dalam daftar dianggap sebagai rakitan tingkat akar. Nilai yang sesuai dengan rakitan dependen dapat disediakan dalam urutan apa pun. Nilai apa pun yang tidak sesuai dengan dependensi rakitan akar diabaikan.

Catatan

Opsi ini tidak tersedia dalam database mandiri.

varbinary_literal

Sebuah literal varbinary .

varbinary_expression

Ekspresi jenis varbinary.

PERMISSION_SET { AMAN | EXTERNAL_ACCESS | TIDAK AMAN }

Menentukan sekumpulan izin akses kode yang diberikan ke rakitan saat diakses oleh SQL Server. Jika tidak ditentukan, SAFE diterapkan sebagai default.

Opsi PERMISSION_SET ini dipengaruhi oleh konfigurasi Server: opsi keamanan ketat clr. Ketika clr strict security diaktifkan, semua rakitan diperlakukan sebagai UNSAFE.

Sebaiknya gunakan SAFE. SAFE adalah set izin yang paling ketat. Kode yang dijalankan oleh rakitan dengan SAFE izin tidak dapat mengakses sumber daya sistem eksternal seperti file, jaringan, variabel lingkungan, atau registri.

EXTERNAL_ACCESS memungkinkan rakitan untuk mengakses sumber daya sistem eksternal tertentu seperti file, jaringan, variabel lingkungan, dan registri.

UNSAFE memungkinkan rakitan akses tidak terbatas ke sumber daya, baik di dalam maupun di luar instans SQL Server. Kode yang UNSAFE berjalan dari dalam rakitan dapat memanggil kode yang tidak dikelola.

SAFE adalah pengaturan izin yang direkomendasikan untuk rakitan yang melakukan tugas komputasi dan manajemen data tanpa mengakses sumber daya di luar instans SQL Server.

Catatan

Opsi EXTERNAL_ACCESS dan UNSAFE tidak tersedia dalam database mandiri.

Sebaiknya gunakan EXTERNAL_ACCESS untuk rakitan yang mengakses sumber daya di luar instans SQL Server. EXTERNAL_ACCESS rakitan termasuk perlindungan SAFE keandalan dan skalabilitas rakitan, tetapi dari perspektif keamanan, mirip UNSAFE dengan rakitan. Kode dalam EXTERNAL_ACCESS rakitan berjalan secara default di bawah akun layanan SQL Server, dan mengakses sumber daya eksternal di bawah akun tersebut, kecuali kode secara eksplisit meniru pemanggil. Oleh karena itu, izin untuk membuat EXTERNAL_ACCESS rakitan harus diberikan hanya untuk masuk yang dipercaya untuk menjalankan kode di bawah akun layanan SQL Server. Untuk informasi selengkapnya tentang peniruan identitas, lihat Keamanan Integrasi CLR.

Menentukan UNSAFE memungkinkan kode dalam rakitan menyelesaikan kebebasan untuk melakukan operasi di ruang proses SQL Server yang berpotensi membahayakan ketahanan SQL Server. UNSAFE rakitan juga dapat berpotensi membalikkan sistem keamanan SQL Server atau runtime bahasa umum. UNSAFE izin harus diberikan hanya kepada rakitan yang sangat tepercaya. Hanya anggota peran server tetap sysadmin yang dapat membuat dan mengubah UNSAFE rakitan.

Untuk informasi selengkapnya tentang kumpulan izin perakitan, lihat Merancang rakitan.

Keamanan akses kode tidak lagi didukung

Runtime bahasa umum menggunakan Keamanan Akses Kode (CAS) dalam .NET Framework, yang tidak lagi didukung sebagai batas keamanan. Rakitan CLR yang dibuat dengan PERMISSION_SET = SAFE mungkin dapat mengakses sumber daya sistem eksternal, memanggil kode yang tidak dikelola, dan memperoleh hak istimewa sysadmin. Di SQL Server 2017 (14.x) dan versi yang lebih baru, sp_configure opsi, keamanan ketat clr, meningkatkan keamanan rakitan CLR. clr strict security diaktifkan secara default, dan memperlakukan SAFE dan EXTERNAL_ACCESS rakitan seolah-olah ditandai UNSAFE. Opsi clr strict security dapat dinonaktifkan untuk kompatibilitas mundur, tetapi tidak disarankan.

Kami menyarankan agar Anda menandatangani semua rakitan dengan sertifikat atau kunci asimetris, dengan login terkait yang telah diberikan UNSAFE ASSEMBLY izin dalam master database. Administrator SQL Server juga dapat menambahkan rakitan ke daftar rakitan, yang harus dipercaya oleh Mesin Database. Untuk informasi selengkapnya, lihat sys.sp_add_trusted_assembly.

Keterangan

CREATE ASSEMBLY mengunggah rakitan yang sebelumnya dikompilasi sebagai file .dll dari kode terkelola untuk digunakan di dalam instans SQL Server.

Saat diaktifkan, PERMISSION_SET opsi dalam CREATE ASSEMBLY pernyataan dan ALTER ASSEMBLY diabaikan pada run-time, tetapi PERMISSION_SET opsi dipertahankan dalam metadata. Mengabaikan opsi meminimalkan melanggar pernyataan kode yang ada.

SQL Server tidak mengizinkan pendaftaran versi rakitan yang berbeda dengan nama, budaya, dan kunci publik yang sama.

Saat mencoba mengakses rakitan yang ditentukan dalam <client_assembly_specifier>, SQL Server meniru konteks keamanan login Windows saat ini. Jika <client_assembly_specifier> menentukan lokasi jaringan (jalur UNC), peniruan login saat ini tidak dibawa ke lokasi jaringan karena batasan delegasi. Dalam hal ini, akses dibuat menggunakan konteks keamanan akun layanan SQL Server. Untuk informasi selengkapnya, lihat Kredensial (Mesin Database).

Selain rakitan akar yang ditentukan oleh assembly_name, SQL Server mencoba mengunggah rakitan apa pun yang dirujuk oleh rakitan akar yang diunggah. Jika rakitan yang direferensikan sudah diunggah ke database karena pernyataan sebelumnya CREATE ASSEMBLY , rakitan ini tidak diunggah tetapi tersedia untuk rakitan akar. Jika rakitan dependen sebelumnya tidak diunggah, tetapi SQL Server tidak dapat menemukan file manifesnya di direktori sumber, CREATE ASSEMBLY mengembalikan kesalahan.

Jika ada rakitan dependen yang direferensikan oleh rakitan akar belum ada di database dan secara implisit dimuat bersama dengan rakitan akar, mereka memiliki izin yang sama yang ditetapkan sebagai rakitan tingkat akar. Jika rakitan dependen harus dibuat dengan menggunakan set izin yang berbeda dari rakitan tingkat akar, mereka harus diunggah secara eksplisit sebelum rakitan tingkat akar dengan set izin yang sesuai.

Validasi Rakitan

SQL Server memindai biner rakitan yang diunggah oleh CREATE ASSEMBLY pernyataan untuk menjamin pemeriksaan berikut:

  • Biner rakitan terbentuk dengan baik dengan segmen metadata dan kode yang valid, dan segmen kode memiliki instruksi Bahasa Perantara Microsoft (MSIL) yang valid.

  • Kumpulan rakitan sistem yang dirujuknya adalah salah satu rakitan yang didukung berikut di SQL Server: Microsoft.VisualBasic.dll, , mscorlib.dll, System.Data.dll, System.dllMicrosoft.VisualC.dllSystem.Xml.dll, , CustomMarshallers.dll, System.Security.dll, System.Web.Services.dll, , System.Data.SqlXml.dll, , System.Core.dll, dan .System.Xml.Linq.dll Rakitan sistem lain dapat direferensikan, tetapi harus didaftarkan secara eksplisit dalam database.

  • Untuk rakitan yang dibuat dengan menggunakan SAFE atau EXTERNAL ACCESS set izin:

    • Kode rakitan harus berjenis aman. Keamanan jenis ditetapkan dengan menjalankan pemverifikasi runtime bahasa umum terhadap perakitan.

    • Rakitan tidak boleh berisi anggota data statis apa pun di kelasnya kecuali ditandai sebagai baca-saja.

    • Kelas dalam rakitan tidak dapat berisi metode finalizer.

    • Kelas atau metode assembly harus diannotasikan hanya dengan atribut kode yang diizinkan. Untuk informasi selengkapnya, lihat Integrasi CLR: atribut kustom untuk rutinitas CLR.

Selain pemeriksaan sebelumnya yang dilakukan saat CREATE ASSEMBLY dijalankan, ada pemeriksaan tambahan yang dilakukan pada waktu eksekusi kode di rakitan:

  • Memanggil API .NET Framework tertentu yang memerlukan Izin Akses Kode tertentu mungkin gagal jika kumpulan izin rakitan tidak menyertakan izin tersebut.

  • Untuk SAFE dan EXTERNAL_ACCESS rakitan, setiap upaya untuk memanggil .NET Framework API yang diannotasikan dengan HostProtectionAttributes tertentu gagal.

Untuk informasi selengkapnya, lihat Mendesain rakitan.

Izin

Memerlukan CREATE ASSEMBLY izin.

Jika PERMISSION_SET = EXTERNAL_ACCESS ditentukan, memerlukan EXTERNAL ACCESS ASSEMBLY izin pada server. Jika PERMISSION_SET = UNSAFE ditentukan, memerlukan UNSAFE ASSEMBLY izin pada server.

Pengguna harus menjadi pemilik rakitan apa pun yang direferensikan oleh rakitan yang akan diunggah jika rakitan sudah ada di database. Untuk mengunggah rakitan dengan menggunakan jalur file, pengguna saat ini harus merupakan login terautentikasi Windows atau anggota peran server tetap sysadmin . Login Windows pengguna yang dijalankan CREATE ASSEMBLY harus memiliki izin baca pada berbagi dan file yang dimuat dalam pernyataan.

Izin dengan keamanan ketat CLR

Izin berikut diperlukan untuk membuat rakitan CLR saat CLR strict security diaktifkan:

  • Pengguna harus memiliki CREATE ASSEMBLY izin
  • Dan salah satu kondisi berikut juga harus benar:
    • Rakitan ditandatangani dengan sertifikat atau kunci asimetris yang memiliki login yang sesuai dengan UNSAFE ASSEMBLY izin di server. Penandatanganan rakitan disarankan.
    • Database memiliki properti yang TRUSTWORTHY diatur ke ON, dan database dimiliki oleh login yang memiliki UNSAFE ASSEMBLY izin di server. Opsi ini tidak disarankan.

Untuk informasi selengkapnya tentang kumpulan izin perakitan, lihat Merancang rakitan.

Contoh

J. Membuat assembly dari DLL

Contoh berikut mengasumsikan bahwa sampel Mesin Database SQL Server diinstal di lokasi default komputer lokal, dan HelloWorld.csproj aplikasi sampel dikompilasi. Untuk informasi selengkapnya, lihat Sampel Halo Dunia.

CREATE ASSEMBLY HelloWorld
FROM '<system_drive>:\Program Files\Microsoft SQL Server\100\Samples\HelloWorld\CS\HelloWorld\bin\debug\HelloWorld.dll'
WITH PERMISSION_SET = SAFE;

Penting

Azure SQL Database tidak mendukung pembuatan rakitan dari file.

B. Membuat rakitan dari bit rakitan

Ganti bit sampel (yang tidak lengkap atau valid) dengan bit rakitan Anda.

CREATE ASSEMBLY HelloWorld
    FROM 0x4D5A900000000000
WITH PERMISSION_SET = SAFE;