Gibt es besondere Sicherheits- oder Leistungsrisiken bei der Verwendung der CLR in SQL Server?
sql-server
performance
security
sql-clr
SQLBen
quelle
quelle
Antworten:
Die Frage ist, wie Remus betonte, zu allgemein, um eine Antwort zu erhalten, da die Antwort vom Kontext abhängt, welche Funktionen verwendet werden sollen und wie sie verwendet werden.
In Bezug auf "Sicherheit":
Wenn Sie nach etwas fragen, das in einer mit gekennzeichneten Baugruppe ausgeführt werden kann
PERMISSION_SET = SAFE
, gibt es keine Probleme, die ich jemals finden konnte. Und SQLCLR ist "sicherer" als die Verwendungxp_cmdshell
oder die wunderbaren (das war Sarkasmus)sp_OA*
Procs (oder sogar Extended Stored Procedures, aber hoffentlich erstellt niemand mehr diese).Wenn Sie wissen möchten, was "SAFE" in der Praxis bedeutet, lesen Sie bitte diesen Artikel: Treppe zu SQLCLR Level 3: Sicherheit (Allgemeine und SAFE-Baugruppen) (kostenlose Registrierung erforderlich).
Wenn Sie nach etwas fragen, das in einer mit gekennzeichneten Baugruppe ausgeführt
PERMISSION_SET = EXTERNAL_ACCESS
werden kann, bestehen wiederum Risiken, je nachdem, welche Funktionen verwendet werden. Wenn Sie eine Routine zum Lesen von Verzeichnissen und Dateinamen schreiben (dh schreibgeschützt), ist es nur eine Frage dessen, was gesehen und nicht gesehen werden sollte. Wenn Sie Code schreiben, mit dem eine Datei gelöscht werden kann, steigt das Risiko. Was mit diesen externen Ressourcen getan werden kann , wird jedoch gesteuert durch:Wenn Sie nach etwas fragen, das in einer mit gekennzeichneten Baugruppe ausgeführt werden kann
PERMISSION_SET = UNSAFE
, das ist ziemlich offen. Viele Funktionen können nur in UNSAFE-Assemblys verwendet werden, da es sich eher um Stabilitäts- und / oder konsistente Verhaltensprobleme als um Sicherheit oder Leistung handelt. In einer UNSAFE-Assembly ist es beispielsweise möglich, eine beschreibbare statische Variable zu haben. Dies ist normalerweise keine gute Sache, da die SQLCLR-Klassen für alle Sitzungen gemeinsam genutzt werden. Wenn Sie beabsichtigen, Daten im Speicher über alle Sitzungen hinweg gemeinsam zu nutzen und die Rennbedingungen geplant haben (und zahlreiche Tests durchgeführt haben), sollten Sie in Ordnung sein, da Sie dieses Verhalten erwarten. Wenn Sie jedoch einfach wollten, dass eine beschreibbare statische Variable einen Wert für eine bestimmte Sitzung zwischenspeichert, damit sie nicht erneut nachgeschlagen oder erneut berechnet werden muss, und nicht wissen, dass andere Sitzungen diesen Wert lesen und möglicherweise überschreiben, das wäre ein Problem.Aber wenn Sie sich Sorgen machen, dass jemand in die Registrierung schreibt, aber noch keinen Code hat, der tatsächlich in die Registrierung schreibt, müssen Sie sich wahrscheinlich keine Sorgen machen ;-).
Wenn Sie einen Überblick über die praktische Funktionsweise von EXTERNAL_ACCESS und UNSAFE sowie den Unterschied zwischen der Einstellung
TRUSTWORTHY ON
(nicht bevorzugt) und der Verwendung eines auf asymmetrischen Schlüsseln oder Zertifikaten basierenden Logins wünschen, lesen Sie bitte diesen Artikel: Treppe zu SQLCLR Level 4: Sicherheit (EXTERNE und UNSICHERE Baugruppen) (kostenlose Registrierung erforderlich).In Bezug auf "Leistung":
Dies ist alles eine Frage dessen, was Sie versuchen und wie Sie es tun. Es gibt einige Dinge, die in SQLCLR viel schneller sind, und einige Dinge, die langsamer sind. Aber genau wie bei T-SQL ist es möglich, eine etwas einfache und / oder effiziente Aufgabe zu übernehmen und sie durch falsche Vorgehensweisen kompliziert und / oder ineffizient zu machen. Die Verwendung von SQL CLR ist jedoch von Natur aus nicht langsamer.
quelle
SQLCLR-Assemblys können mit drei Sicherheitszugriffsebenen installiert werden :
SAFE | EXTERNAL_ACCESS | UNSAFE
. Dies ist ausführlich dokumentiert, siehe BaugruppenCREATE ASSEMBLY
und Entwerfen von Baugruppen :Es gibt weitere Einschränkungen für zulässige CLR-Attribute und nur eine Teilmenge der .Net Framework-Assemblys wird unterstützt. Weitere Informationen finden Sie in der verknüpften Dokumentation.
In Bezug auf die Leistung ist es am wichtigsten, sich daran zu erinnern, dass SQL Server eine kooperative Multitasking-Umgebung ist, CLR jedoch nicht. Der SQLCLR-Code muss immer dann aufgerufen werden,
Thread.BeginThreadAffinity()
wenn er die CPU für eine beliebige Dauer (einschließlich Blockierung) belastet . Adam Machanic hat eine hervorragende Präsentation zum Thema, Daten ansehen , Schneller: Microsoft SQL Server-Leistungstechniken mit SQLCLR .Das Thema ist groß und die Frage vage. SQLCLR kann einige einzigartige Aufgaben ausführen, mit denen keine andere Funktion übereinstimmen kann. Und SQLCLR ist nur eine weitere Waffe im SQL Server-Arsenal, mit der Sie sich in den Fuß schießen können, Leistung oder Sicherheit. Lesen Sie die Dokumentation.
quelle