0

Ich bin in Rails Activerecord arbeiten und Postgresql und bin versucht, eine SQL-Anweisung zu sanieren, die eine gespeicherte Prozedur ausführt:Sanitizing Aufruf einer gespeicherten Prozedur in SQL-Anweisung

query =<<-SQL 
    SELECT * 
    FROM #{stored_procedure_name} 
    (
     #{param_1}, 
     #{param_2} 
    ) 
SQL 

Die obige Anweisung funktioniert, wenn sie ausgeführt . Soweit ich weiß, sollte die gespeicherte Prozedur aufgrund der Parametrisierung (aufgrund der Art und Weise, wie ich die Funktion definiert habe) auf der Datenbankebene bereinigt werden. Wie kann ich jedoch die query oben sterilisieren? Ich habe versucht, sanitize Methoden des Active ohne Erfolg durch so etwas wie

statement =<<-SQL 
    SELECT * FROM ? (?, ?) 
SQL 

und anschließend in die Parameter übergeben, aber das hat nicht funktioniert - und scheint dumm.

Antwort

0

Dies ist, wie ich dies getan haben:

  1. die String-Abfrage erstellen wie Sie taten, aber die ? mit benannten Parametern, wie diese ersetzen:

    statement = <<-SQL 
    SELECT * FROM :procedure_name (:param_1, :param_2) 
    SQL 
    
  2. Jetzt Ihren Anruf Abfrage wie folgt:

    YourModel.find_by_sql([ 
        statement, 
        { 
        procedure_name: 'your_procedure_name', 
        param_1: 'your param 1 value', 
        param_2: 'your second param value' 
        } 
    ]) 
    

Das hat für mich funktioniert, komplexe Select-Abfragen auszuführen, ich habe es nicht für gespeicherte Prozeduren versucht, aber ich sehe nicht, warum es nicht funktionieren sollte.

+0

Leider löst dies einen Fehler aus 'SELECT * FROM' procedure_name'' weil der Funktionsname in einfache Anführungszeichen eingeschlossen ist – fibono

+1

macht Sinn, lass mich sehen, ob ich einen Weg finden kann, das zu beheben. – fanta

+0

Nein, Sie können das nicht beheben, der Prozedurname darf kein Parameter für die Abfrage sein. – Shadow

Verwandte Themen