Übersicht über die CLR-Integration
Gilt für: SQL Server Azure SQL Managed Instance
CLR (Common Language Runtime) steht im Mittelpunkt von Microsoft .NET Framework und stellt die Ausführungsumgebung für sämtlichen .NET Framework-Code bereit. Code, der innerhalb der CLR ausgeführt wird, wird als verwalteter Code bezeichnet. CLR stellt verschiedene Funktionen und Dienste für die Programmausführung bereit, unter anderem Just-In-Time-Kompilierung (JIT), Speicherzuordnung und -verwaltung, Erzwingen der Typsicherheit, Ausnahmebehandlung, Threadverwaltung und Sicherheit. Weitere Informationen finden Sie im .NET Framework-Entwicklungshandbuch.
Hinweis
Weitere Informationen zur Verwendung der neuen .NET mit SQL Server-Spracherweiterungen finden Sie unter Aufrufen der .NET-Laufzeit in SQL Server-Spracherweiterungen.
Mit der in SQL Server gehosteten CLR-Integration können Sie gespeicherte Prozeduren, Trigger, benutzerdefinierte Funktionen, benutzerdefinierte Typen und benutzerdefinierte Aggregate in verwaltetem Code erstellen. Da verwalteter Code vor der Ausführung zu systemeigenem Code kompiliert wird, können Sie in einigen Szenarien erhebliche Leistungssteigerungen erzielen.
Codezugriffssicherheit
In SQL Server 2016 (13.x) und früheren Versionen verhinderte Code Access Security (CAS), dass Assemblys bestimmte Vorgänge ausführen.
CLR verwendet die Codezugriffssicherheit (Code Access Security, CAS) im .NET Framework, die nicht länger als Sicherheitsbegrenzung unterstützt wird. Eine CLR-Assembly, die mit PERMISSION_SET = SAFE
erstellt wurde, kann womöglich auf externe Systemressourcen zugreifen, nicht verwalteten Code aufrufen und sysadmin-Privilegien erwerben. In SQL Server 2017 (14.x) und höheren Versionen verbessert die sp_configure
Option clr strict security die Sicherheit von CLR-Assemblys. clr strict security
ist standardmäßig aktiviert und behandelt SAFE
- und EXTERNAL_ACCESS
-Assemblys so, als wären Sie als UNSAFE
gekennzeichnet. Die Option clr strict security
kann für die Abwärtskompatibilität deaktiviert werden, es wird jedoch nicht empfohlen.
Wir empfehlen, dass Sie alle Assemblys durch ein Zertifikat oder einen asymmetrischen Schlüssel mit einem entsprechenden Anmeldenamen signieren, dem UNSAFE ASSEMBLY
-Berechtigung für die master
-Datenbank erteilt wurde. SQL Server-Administratoren können auch Assemblys einer Liste von Assemblys hinzufügen, der die Datenbank-Engine vertrauen sollte. Weitere Informationen finden Sie unter sys.sp_add_trusted_assembly.
Vorteile der CLR-Integration
Transact-SQL wurde für den direkten Datenzugriff und die Manipulation in der Datenbank entwickelt. Transact-SQL excels at data access and management, it's not a full-fledged programming language. Transact-SQL unterstützt beispielsweise keine Arrays, Auflistungen, für jede Schleifen, Bitverschiebung oder Klassen. Während einige dieser Konstrukte in Transact-SQL simuliert werden können, hat verwalteter Code integrierte Unterstützung für diese Konstrukte. Je nach Szenario können diese Funktionen einen zwingenden Grund darstellen, bestimmte Datenbankfunktionalitäten in verwaltetem Code zu implementieren.
Visual Basic und C# bieten objektorientierte Funktionen wie Kapselung, Vererbung und Polymorphismus. Damit verbundener Code kann jetzt leicht in Klassen und Namespaces organisiert werden. Wenn Sie mit großen Mengen von Servercode arbeiten, können Sie mit diesen Funktionen Ihren Code einfacher organisieren und verwalten.
Verwalteter Code eignet sich besser als Transact-SQL für Berechnungen und komplizierte Ausführungslogik und bietet umfassende Unterstützung für viele komplexe Aufgaben, einschließlich Zeichenfolgenbehandlung und reguläre Ausdrücke. Mit der in der .NET Framework-Bibliothek gefundenen Funktionalität haben Sie Zugriff auf Tausende vordefinierter Klassen und Routinen. Auf diese Klassen kann von jeder gespeicherten Prozedur, einem Trigger oder einer benutzerdefinierten Funktion aus zugegriffen werden. Die Basisklassenbibliothek (BCL) enthält Klassen, die Funktionen für die Zeichenfolgenmanipulation, erweiterte mathematische Vorgänge, Dateizugriff, Kryptografie und vieles mehr bereitstellen.
Hinweis
Während viele dieser Klassen für die Verwendung in CLR-Code in SQL Server verfügbar sind, sind solche, die nicht für die serverseitige Verwendung geeignet sind (z. B. Fensterklassen), nicht verfügbar. Weitere Informationen finden Sie unter Unterstützte .NET Framework-Bibliotheken.
Einer der Vorteile von verwaltetem Code besteht in der Typsicherheit, d. h. die Gewissheit, dass der Code nur in einer genau definierten und zulässigen Weise auf Typen zugreift. Bevor verwalteter Code ausgeführt wird, überprüft die CLR, dass der Code sicher ist. Beispielsweise wird der Code überprüft, um sicherzustellen, dass kein Speicher gelesen wird, der zuvor nicht geschrieben wurde. Die CLR kann auch sicherstellen, dass Code keinen nicht verwalteten Arbeitsspeicher bearbeitet.
Die CLR-Integration bietet das Potenzial zu verbesserter Leistung. Weitere Informationen finden Sie unter Performance of CLR integration architecture.
Auswählen zwischen Transact-SQL und verwaltetem Code
Wenn Sie gespeicherte Prozeduren, Trigger und benutzerdefinierte Funktionen schreiben, müssen Sie entscheiden, ob Herkömmliche Transact-SQL oder eine .NET Framework-Sprache wie Visual Basic oder C# verwendet werden soll. Verwenden Sie Transact-SQL, wenn der Code hauptsächlich Datenzugriff mit wenig oder ohne prozeduraler Logik durchführt. Verwenden Sie verwalteten Code für CPU-intensive Funktionen und Prozeduren, die eine komplexe Logik aufweisen, oder in Fällen, in denen Sie auf die Basisklassenbibliothek (Base Class Library, BCL) von .NET Framework zurückgreifen möchten.
Wählen Sie zwischen Ausführung auf dem Server und der Ausführung im Client aus.
Ein weiterer Faktor in Ihrer Entscheidung darüber, ob Transact-SQL oder verwalteter Code verwendet werden soll, ist der Ort, an dem Sich Ihr Code befinden soll, der Servercomputer oder der Clientcomputer. Sowohl Transact-SQL als auch verwalteter Code können auf dem Server ausgeführt werden. Dies hält Code und Daten näher zusammen und ermöglicht Ihnen außerdem, die Verarbeitungskapazität des Servers auszunutzen. Auf der anderen Seite möchten Sie möglicherweise vermeiden, dass Prozessorintensive Aufgaben auf Ihrem Datenbankserver platziert werden. Die meisten Clientcomputer sind heute leistungsfähig, und Sie können diese Verarbeitungsleistung nutzen, indem Sie so viel Code wie möglich auf dem Client platzieren. Verwalteter Code kann auf einem Clientcomputer ausgeführt werden, während Transact-SQL nicht möglich ist.
Auswählen zwischen erweiterten gespeicherten Prozeduren und verwaltetem Code
Erweiterte gespeicherte Prozeduren können erstellt werden, um Funktionen auszuführen, die mit gespeicherten Transact-SQL-Prozeduren nicht möglich sind. Erweiterte gespeicherte Prozeduren können jedoch die Integrität des SQL Server-Prozesses gefährden, während verwalteter Code, der als typsicher überprüft wurde, nicht möglich ist. Darüber hinaus sind Speicherverwaltung, Planung von Threads und Fasern sowie Synchronisierungsdienste tiefer in den verwalteten Code der CLR und SQL Server integriert. Bei der CLR-Integration haben Sie eine sicherere Möglichkeit als erweiterte gespeicherte Prozeduren, um die gespeicherten Prozeduren zu schreiben, die Sie zum Ausführen von Aufgaben benötigen, die in Transact-SQL nicht möglich sind. Weitere Informationen zur CLR-Integration und erweiterten gespeicherten Prozeduren finden Sie unter Performance of CLR integration architecture.