Rakitan - Merancang

Berlaku untuk:SQL Server

Topik ini menjelaskan faktor-faktor berikut yang harus Anda pertimbangkan saat Merancang rakitan:

  • Rakitan kemasan

  • Mengelola keamanan perakitan

  • Pembatasan rakitan

Rakitan Kemasan

Rakitan dapat berisi fungsionalitas untuk lebih dari satu SQL Server rutinitas atau mengetik di kelas dan metodenya. Sebagian besar waktu, masuk akal untuk mengemas fungsionalitas rutinitas yang melakukan fungsi terkait dalam perakitan yang sama, terutama jika rutinitas ini berbagi kelas yang metodenya memanggil satu sama lain. Misalnya, kelas yang melakukan tugas manajemen entri data untuk pemicu runtime bahasa umum (CLR) dan prosedur tersimpan CLR dapat dipaketkan dalam rakitan yang sama. Ini karena metode untuk kelas-kelas ini lebih mungkin memanggil satu sama lain daripada yang kurang terkait tugas.

Saat Anda mengemas kode ke dalam perakitan, Anda harus mempertimbangkan hal berikut:

  • Jenis dan indeks yang ditentukan pengguna CLR yang bergantung pada fungsi yang ditentukan pengguna CLR dapat menyebabkan data yang bertahan berada dalam database yang bergantung pada perakitan. Memodifikasi kode assembly sering kali lebih kompleks ketika ada data persisten yang bergantung pada perakitan dalam database. Oleh karena itu, umumnya lebih baik untuk memisahkan kode tentang dependensi data yang bertahan mengandalkan (seperti jenis dan indeks yang ditentukan pengguna menggunakan fungsi yang ditentukan pengguna) dari kode yang tidak memiliki dependensi data yang bertahan tersebut. Untuk informasi selengkapnya, lihat Menerapkan Assembly dan ALTER ASSEMBLY (Transact-SQL).

  • Jika sepotong kode terkelola memerlukan izin yang lebih tinggi, lebih baik memisahkan kode tersebut menjadi rakitan terpisah dari kode yang tidak memerlukan izin yang lebih tinggi.

Mengelola Keamanan Assembly

Anda dapat mengontrol berapa banyak assembly yang dapat mengakses sumber daya yang dilindungi oleh .NET Code Access Security saat menjalankan kode terkelola. Anda melakukan ini dengan menentukan salah satu dari tiga set izin saat membuat atau memodifikasi assembly: SAFE, EXTERNAL_ACCESS, atau UNSAFE.

SAFE

SAFE adalah kumpulan izin default dan merupakan 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. Kode SAFE dapat mengakses data dari database SQL Server lokal atau melakukan komputasi dan logika bisnis yang tidak melibatkan akses sumber daya di luar database lokal.

Sebagian besar rakitan melakukan tugas komputasi dan manajemen data tanpa harus mengakses sumber daya di luar SQL Server. Oleh karena itu, kami merekomendasikan SAFE sebagai izin perakitan yang ditetapkan.

EXTERNAL_ACCESS

EXTERNAL_ACCESS memungkinkan rakitan mengakses sumber daya sistem eksternal tertentu seperti file, jaringan, layanan Web, variabel lingkungan, dan registri. Hanya SQL Server masuk dengan izin AKSES EKSTERNAL yang dapat membuat rakitan EXTERNAL_ACCESS.

Rakitan aman dan EXTERNAL_ACCESS hanya dapat berisi kode yang dapat diverifikasi jenis aman. Ini berarti bahwa rakitan ini hanya dapat mengakses kelas melalui titik masuk yang terdefinisi dengan baik yang valid untuk definisi jenis. Oleh karena itu, mereka tidak dapat secara sembrono mengakses buffer memori yang tidak dimiliki oleh kode. Selain itu, mereka tidak dapat melakukan operasi yang mungkin memiliki efek buruk pada ketahanan proses SQL Server.

UNSAFE

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

Selain itu, menentukan UNSAFE memungkinkan kode dalam perakitan untuk melakukan operasi yang dianggap tidak aman jenis oleh pemverifikasi CLR. Operasi ini berpotensi mengakses buffer memori di ruang proses SQL Server dengan cara yang tidak terkendali. Rakitan TIDAK AMAN juga dapat berpotensi membalikkan sistem keamanan baik SQL Server atau runtime bahasa umum. Izin TIDAK AMAN harus diberikan hanya kepada rakitan yang sangat tepercaya oleh pengembang atau administrator berpengalaman. Hanya anggota peran server tetap sysadmin yang dapat membuat rakitan TIDAK AMAN.

Pembatasan Rakitan

SQL Server menempatkan batasan tertentu pada kode terkelola dalam rakitan untuk memastikan bahwa mereka dapat berjalan dengan cara yang andal dan dapat diskalakan. Ini berarti bahwa operasi tertentu yang dapat membahayakan ketahanan server tidak diizinkan dalam rakitan aman dan EXTERNAL_ACCESS.

Atribut Kustom yang Tidak Diizinkan

Rakitan tidak dapat diannotasikan dengan atribut kustom berikut:

System.ContextStaticAttribute  
System.MTAThreadAttribute  
System.Runtime.CompilerServices.MethodImplAttribute  
System.Runtime.CompilerServices.CompilationRelaxationsAttribute  
System.Runtime.Remoting.Contexts.ContextAttribute  
System.Runtime.Remoting.Contexts.SynchronizationAttribute  
System.Runtime.InteropServices.DllImportAttribute   
System.Security.Permissions.CodeAccessSecurityAttribute  
System.STAThreadAttribute  
System.ThreadStaticAttribute  

Selain itu, rakitan AMAN dan EXTERNAL_ACCESS tidak dapat diannotasikan dengan atribut kustom berikut:

System.Security.SuppressUnmanagedCodeSecurityAttribute  
System.Security.UnverifiableCodeAttribute  

API .NET Framework yang tidak diizinkan

Microsoft .NET Framework API apa pun yang diannotasi dengan salah satu HostProtectionAttributes yang tidak diizinkan tidak dapat dipanggil dari rakitan AMAN dan EXTERNAL_ACCESS.

eSelfAffectingProcessMgmt  
eSelfAffectingThreading  
eSynchronization  
eSharedState   
eExternalProcessMgmt  
eExternalThreading  
eSecurityInfrastructure  
eMayLeakOnAbort  
eUI  

Rakitan .NET Framework yang didukung

Setiap rakitan yang direferensikan oleh rakitan kustom Anda harus dimuat ke dalam SQL Server dengan menggunakan CREATE ASSEMBLY. Rakitan .NET Framework berikut sudah dimuat ke dalam SQL Server dan, oleh karena itu, dapat dirujuk oleh rakitan kustom tanpa harus menggunakan CREATE ASSEMBLY.

CustomMarshalers.dll  
Microsoft.VisualBasic.dll  
Microsoft.VisualC.dll  
mscorlib.dll  
System.dll  
System.Configuration.dll  
System.Core.dll  
System.Data.dll  
System.Data.OracleClient.dll  
System.Data.SqlXml.dll  
System.Deployment.dll  
System.Security.dll  
System.Transactions.dll  
System.Web.Services.dll  
system.Xml.dll  
System.Xml.Linq.dll  

Lihat juga

Rakitan (Mesin Database)
Keamanan Integrasi CLR