COCOHAR BLOG

Pseudo-View mit PL/SQL-Code-Verschlüsselung

Nature

Oracle-Function als Pseudo-View mit PL/SQL-Code-Verschlüsselung

Titelbeschreibung, 7. Juni 2021

Ziel des folgenden Prozederes war es, einen Oracle-View zu erstellen, dessen PL/SQL-Code verschlüsselt, das heißt, nicht einsehbar und somit auch nicht veränderbar ist.
Laut der allgemein zugänglichen Oracle-Dokumentation kann mithilfe der Package-Funktion "CREATE_WRAPPED", die Bestandteil des Packages "DBMS_DDL" ist, PL/SQL-Code verschlüsselt werden. Allerdings gilt dies nur für Packages (Specification and Body), Types (Specification and Body), Functions und Proceduren, nicht aber für Views.
Daher nun eine Lösung, die vielleicht nicht das Nonplusultra ist, in meiner Umgebung aber (Oracle 12.1.0.2.2) genau das macht, was ich wollte.

Los geht's:

  • 1 Neue Typen definieren (as Object and Table)
    /*
    Der neue DB-Typ beinhaltet die Spalten, welche später über ein einfaches SQL-Select-Statement
    zurückgegeben werden:
    */
    create or replace type my_new_type as object
    (
      cTitle varchar2(100),
      cText varchar2(200),
      constructor function my_new_type return self as result
    );
    /
    -- Body des neuen Typs
    create or replace type body my_new_type is
      constructor function my_new_type return self as result is
      begin
        return;
      end;
    end;
    /
    -- Neuer Type vom Object-Type 'TABLE' mit Rückgabe des zuvor definierten Type 'my_new_type'
    create or replace type my_new_virtual_table_type as table of my_new_type;
    /
  • 2 Neue Funktion mit Rückgabe des neuen Table-Type
    create or replace function my_new_virtual_table(nParam1 number, nParam2 number)
    return my_new_virtual_table_type
    is
      t_attrib_array_ext my_new_virtual_table_type := my_new_virtual_table_type();
    begin
      for i in 1 .. nParam1 -- die Schleife ist nur ein Beispiel
        loop
           t_attrib_array_ext.extend;
           t_attrib_array_ext(i) := my_new_type(); -- wichtig
           t_attrib_array_ext(i).cTitle:= 'mein Titel mit der Nummer: ' || to_char(i);
           t_attrib_array_ext(i).cText := 'mein Text...';
        end loop;
      return t_attrib_array_ext;
    end;
    /
    Wenn alles ohne Kompilierungsfehler durchlief, so wird es beispielsweise im Objekt-Browser des PL/SQL-Developers wie folgt angezeigt:

  • 3 Select auf neue Funktion, so, als wäre es eine Tabelle bzw. View
    select * from TABLE(my_new_virtual_table(5,0));
    Das Ergebnis des SQLs sieht dann beispielsweise so aus:

  • 4 Funktion aus 2. verschlüsseln

    Die unter 2. erstellte Funktion kann nun mithilfe der Package-Funktion "CREATE_WRAPPED" verschlüsselt werden:

    -- Für den Zugriff ist ein GRANT auf 'SYS.DBMS_DDL.CREATE_WRAPPED' notwendig
    declare
     ddl varchar(32767);
    begin
     ddl := 'PL/SQL-Code';
     SYS.DBMS_DDL.CREATE_WRAPPED(ddl);
    end;
    /
    -- bei "ddl := 'PL/SQL-Code'" ist dann der PL/SQL-Code der Function einzusetzen
    -- (Hochkommas müssen mit einem zusätzlichen Hochkomma maskiert werden)
    
    Anschließend kann der Code der Funktion nicht mehr eingesehen werden. Versucht man es, so sieht man folgendes:

Da eine derart verschlüsselte Funktion nicht mehr änderbar ist, versteht es sich von selbst, eine geeignete Quellcodeverwaltung zu verwenden.

Das war's...

Matthias

Warum nehmen sich Menschen die Zeit und schreiben Ihre Erfahrungen und Fähigkeiten nieder, um sie dann auch noch zu veröffentlichen?
Vielleicht, weil sie mitteilungsbedürftig sind. Dagegen spricht aber der Aufwand, der soetwas mit sich bringt und die in den meisten Fällen ausbleibende Rückmeldung. Vielleicht ist es Wichtigtuerei. Vielleicht aber auch einfach nur Dankbarkeit.
Dankbarkeit, weil man selbst schon so viel aus dem Netz "gezogen" hat und nun einfach etwas zurück geben will

So jedenfalls ist es in meinem Fall.

Ich bin dankbar, dass es Menschen gibt die Teilen. Und so versuche auch ich, einen kleinen Teil zurück zu geben...


Akuelle Veröffentlichungen

  • PLSQL-Image Pseudo-View mit PL/SQL-Code-Verschlüsselung
    Ziel des folgenden Prozederes war es, einen Oracle-View zu erstellen, dessen PL/SQL-Code verschlüsselt,...

Tags

PL/SQL Raspberry C/C++ Python JScript HTML Hühnerstall Squeez-Multiroom Saxophon Radfahren Tanzen Reisen Garten alles andere