Ich arbeite an einer Anwendung, die eine dynamische Abfrage verwendet, um eine Select-Anweisung basierend auf Benutzereingaben auszuführen. Nachdem ich die Sicherheit mit DBAs besprochen habe, soll ich meine dynamische Select-Anweisung in eine gespeicherte Prozedur konvertieren.
Ich habe dynamisches SQL mit MSSQL erstellt, kann aber nicht herausfinden, wie es in Oracle SQL konvertiert werden kann.
CREATE PROCEDURE GetCustomer
@FirstN nvarchar(20) = NULL,
@LastN nvarchar(20) = NULL,
@CUserName nvarchar(10) = NULL,
@CID nvarchar(15) = NULL as
DECLARE @sql nvarchar(4000),
SELECT @sql = 'C_FirstName, C_LastName, C_UserName, C_UserID ' +
'FROM CUSTOMER ' +
'WHERE 1=1 ' +
IF @FirstN IS NOT NULL
SELECT @sql = @sql + ' AND C_FirstName like @FirstN '
IF @LastN IS NOT NULL
SELECT @sql = @sql + ' AND C_LastName like @LastN '
IF @CUserName IS NOT NULL
SELECT @sql = @sql + ' AND C_UserName like @CUserName '
IF @CID IS NOT NULL
SELECT @sql = @sql + ' AND C_UserID like @CID '
EXEC sp_executesql @sql, N'@C_FirstName nvarchar(20), @C_LastName nvarchar(20), @CUserName nvarchar(10), @CID nvarchar(15)',
@FirstN, @LastN, @CUserName, @CID
* Bitte beachten Sie, dass ich die SQL-Injection verhindern möchte. Ich möchte nicht nur einen String zusammenfügen
** Ich habe eine separate Klasse zum Erstellen dieser dynamischen Abfrage für meine Anwendung in .net erstellt. Ich habe fast 1000 Codezeilen, um alles zu verarbeiten und SQL-Injection zu verhindern, aber DBAs haben mir mitgeteilt, dass sie gespeicherte Prozeduren wünschen, damit sie Eingaben und steuern können Ausgabe.
Antworten:
Dies könnte Ihnen eine Idee geben:
Später in SQL * Plus:
Bearbeiten : Der Kommentar ist richtig und die Prozedur unterliegt der SQL-Injection . Um dies zu verhindern, können Sie Bindungsvariablen wie in dieser geänderten Prozedur verwenden:
Beachten Sie, dass die select-Anweisung nun unabhängig von der Eingabe
select ... from ... where 1=1 and col1 like :1 and col2 :2 ...
offensichtlich viel sicherer wird.quelle
Sie benötigen nicht unbedingt dynamisches SQL, nur weil bestimmte Bedingungen nicht zutreffen, wenn sie nicht vorhanden sind.
Das Platzieren dieses Codes in einer gespeicherten Prozedur in einem Paket ist eine hervorragende Idee.
Oracle bietet eine hervorragende Dokumentation, mit der Sie sich über gespeicherte Prozeduren und Pakete auf dem Laufenden halten können. Beginnen Sie möglicherweise mit dem Konzepthandbuch , um zu verstehen, wie Oracle funktioniert, und fahren Sie dann mit der SQL-Sprachreferenz und der PL / SQL-Sprachreferenz fort, um Informationen zu Ihrer aktuellen Aufgabe zu erhalten.
quelle
Dies ist keine unabhängige Antwort, sondern eine zusätzliche Erklärung für den Code von René Nyffenegger unter Verwendung von Bindungsvariablen.
SaUce fragte, warum dieser Code immun gegen SQL-Injektion ist.
Hier ändere ich Renés Code, um die dynamische Anweisung nicht auszuführen, sondern anzuzeigen:
Jetzt kann ich Anrufe wie versuchen
Das Ergebnis ist:
In Renés Code wird dies wie folgt ausgeführt:
Sie sehen, es spielt keine Rolle, welcher Wert für FirstN angegeben wird. Die Bedeutung der Abfrage wird nie geändert.
Es gibt weitere Gründe für die Verwendung der Variablenbindung, die für Entwickler mit SQL Server-Hintergrund schwer zu verstehen sind. Sie hängen davon ab, wie Oracle vorkompilierte Ausführungspläne im gemeinsam genutzten Pool speichert. Wenn keine Bindungsvariablen verwendet werden, ergeben sich unterschiedliche Anweisungen und Ausführungspläne, während bei Verwendung von Bindungsvariablen ein einzelner Ausführungsplan verwendet wird.
quelle
Für Ihre gespeicherte Prozedur würde die beste Migration zu Oracle aussehen
OK, es ist spät und ich bin ein bisschen faul, aber die restlichen 12 Fälle auszufüllen ist einfach.
Die Nichtverwendung von dynamischem SQL hat einige Vorteile:
Denken Sie nicht, weil es für einen Menschen langweilig aussieht, dass es für einen Computer schlecht ist (insbesondere wenn Oracle ausgeführt wird).
Fügen Sie jedoch keine weiteren Parameter hinzu, um mich zu zwingen, eine Lösung mit dynamischem SQL anzuzeigen. Vermeiden Sie stattdessen verrückte Designs, die solche Lösungen erfordern.
quelle