Bagikan melalui


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_ACCESSatau 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