BUAT RAKITAN (Transact-SQL)

Berlaku untuk:SQL ServerAzure 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.

Peringatan

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. Dimulai dengan SQL Server 2017 (14.x), opsi yang sp_configure disebut clr strict security diperkenalkan untuk 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 ini tidak disarankan. Microsoft menyarankan agar semua rakitan ditandatangani oleh sertifikat atau kunci asimetris dengan login terkait yang telah diberikan UNSAFE ASSEMBLY izin dalam database master. Untuk informasi selengkapnya, lihat Keamanan ketat CLR.

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
Adalah 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 izin IMPERSONATE 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 multimodul. 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 ditiru.

<assembly_bits>
Adalah 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
Adalah harfiah varbinary.

varbinary_expression
Adalah ekspresi jenis varbinary.

PERMISSION_SET { AMAN | EXTERNAL_ACCESS | TIDAK AMAN }

Penting

Opsi PERMISSION_SET dipengaruhi oleh clr strict security opsi , dijelaskan dalam peringatan pembukaan. Ketika clr strict security diaktifkan, semua rakitan diperlakukan sebagai UNSAFE.

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

Sebaiknya gunakan SAFE. SAFE adalah set izin yang paling ketat. Kode yang dijalankan oleh rakitan dengan izin SAFE 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.

Catatan

Opsi ini tidak tersedia dalam database mandiri.

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

Catatan

Opsi ini tidak tersedia dalam database mandiri.

Penting

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

Sebaiknya gunakan EXTERNAL_ACCESS untuk rakitan yang mengakses sumber daya di luar instans SQL Server. EXTERNAL_ACCESS rakitan termasuk perlindungan keandalan dan skalabilitas rakitan SAFE, tetapi dari perspektif keamanan mirip dengan rakitan YANG TIDAK AMAN. Ini karena kode dalam rakitan EXTERNAL_ACCESS 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 rakitan EXTERNAL_ACCESS 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 TIDAK AMAN memungkinkan kode dalam kebebasan lengkap perakitan untuk melakukan operasi di ruang proses SQL Server yang berpotensi membahayakan ketahanan SQL Server. Rakitan TIDAK AMAN juga dapat berpotensi membalikkan sistem keamanan SQL Server atau runtime bahasa umum. Izin TIDAK AMAN harus diberikan hanya kepada rakitan yang sangat tepercaya. Hanya anggota peran server tetap sysadmin yang dapat membuat dan mengubah rakitan TIDAK AMAN.

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

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 diteruskan 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 CREATE ASSEMBLY sebelumnya, rakitan ini tidak diunggah tetapi tersedia untuk rakitan root. 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 melakukan pemeriksaan pada biner rakitan yang diunggah oleh pernyataan CREATE ASSEMBLY untuk menjamin hal 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.dll, System.Xml.dll, Microsoft.Visualc.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 kumpulan izin AKSES AMAN atau EKSTERNAL:

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

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

    • Kelas dalam rakitan tidak boleh berisi metode finalizer.

    • Kelas atau metode assembly harus diannotasikan hanya dengan atribut kode yang diizinkan. Untuk informasi selengkapnya, lihat 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 Microsoft .NET Framework tertentu yang memerlukan Izin Akses Kode tertentu mungkin gagal jika kumpulan izin perakitan tidak menyertakan izin tersebut.

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

Untuk informasi selengkapnya, lihat Merancang Rakitan.

Izin

Memerlukan izin CREATE ASSEMBLY.

Jika PERMISSION_SET = EXTERNAL_ACCESS ditentukan, memerlukan izin RAKITAN AKSES EKSTERNAL di server. Jika PERMISSION_SET = TIDAK AMAN ditentukan, memerlukan izin ASSEMBLY YANG TIDAK AMAN di 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 menjalankan 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

Contoh A: Membuat rakitan dari dll

Berlaku untuk: SQL Server 2008 (10.0.x) dan yang lebih baru.

Contoh berikut mengasumsikan bahwa sampel Mesin Database SQL Server diinstal di lokasi default komputer lokal dan aplikasi sampel HelloWorld.csproj 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.

Contoh B: Membuat rakitan dari bit perakitan

Berlaku untuk: SQL Server 2008 (10.0.x) dan yang lebih baru.

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

CREATE ASSEMBLY HelloWorld  
    FROM 0x4D5A900000000000  
WITH PERMISSION_SET = SAFE;  

Lihat Juga

MENGUBAH RAKITAN (Transact-SQL)
DROP ASSEMBLY (Transact-SQL)
CREATE FUNCTION (Transact-SQL)
CREATE PROCEDURE (Transact-SQL)
BUAT PEMICU (Transact-SQL)
CREATE TYPE (Transact-SQL)
BUAT AGREGAT (Transact-SQL)
EVENTDATA (Transact-SQL)
Skenario Penggunaan dan Contoh untuk Integrasi Common Language Runtime (CLR)