Merancang rakitan
Berlaku untuk: SQL Server
Artikel ini menjelaskan faktor-faktor berikut yang harus Anda pertimbangkan saat merancang rakitan:
- Rakitan kemasan
- Mengelola keamanan perakitan
- Pembatasan rakitan
Rakitan paket
Rakitan dapat berisi fungsionalitas untuk lebih dari satu rutinitas SQL Server atau mengetik di kelas dan metodenya. Sebagian besar waktu, masuk akal untuk mengemas fungsionalitas rutinitas yang melakukan fungsi terkait dalam rakitan 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 cenderung memanggil satu sama lain daripada metode tugas yang kurang terkait.
Saat Anda mengemas kode ke dalam rakitan, pertimbangkan:
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 rakitan sering kali lebih kompleks ketika ada data yang bertahan yang bergantung pada perakitan dalam database. Oleh karena itu, lebih baik 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 ini. Untuk informasi selengkapnya, lihat Menerapkan rakitan dan MENGUBAH RAKITAN (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 perakitan
Anda dapat mengontrol berapa banyak rakitan 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 rakitan: SAFE
, , EXTERNAL_ACCESS
atau UNSAFE
.
Izin SAFE
SAFE
adalah set izin default dan merupakan 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. SAFE
kode 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 sarankan SAFE
sebagai set izin perakitan.
izin EXTERNAL_ACCESS
EXTERNAL_ACCESS
memungkinkan rakitan untuk mengakses sumber daya sistem eksternal tertentu seperti file, jaringan, layanan Web, variabel lingkungan, dan registri. Hanya login SQL Server dengan EXTERNAL ACCESS
izin yang dapat membuat EXTERNAL_ACCESS
rakitan.
SAFE dan EXTERNAL_ACCESS
assembly hanya dapat berisi kode yang dapat diverifikasi type-safe. Ini berarti bahwa rakitan ini hanya dapat mengakses kelas melalui titik masuk yang ditentukan dengan baik yang valid untuk definisi jenis. Oleh karena itu, mereka tidak dapat secara segan-segan 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.
Izin TIDAK AMAN
UNSAFE
memberi rakitan akses tidak terbatas ke sumber daya, baik di dalam maupun di luar SQL Server. Kode yang berjalan dari dalam UNSAFE
rakitan 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. UNSAFE
rakitan juga dapat berpotensi membalikkan sistem keamanan SQL Server atau runtime bahasa umum. Izin TIDAK AMAN harus diberikan hanya kepada rakitan yang sangat tepercaya oleh pengembang atau administrator yang berpengalaman. Hanya anggota peran server tetap sysadmin yang dapat membuat UNSAFE
rakitan.
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 SAFE dan EXTERNAL_ACCESS
assembly.
Atribut kustom yang tidak diizinkan
Rakitan tidak dapat diannotasi 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, SAFE
dan EXTERNAL_ACCESS
rakitan tidak dapat diannotasi 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 HostProtectionAttributes
satu yang tidak diizinkan tidak dapat dipanggil dari SAFE
dan EXTERNAL_ACCESS
rakitan.
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 SQL Server dengan menggunakan CREATE ASSEMBLY
. Rakitan .NET Framework berikut sudah dimuat ke 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