Zum Inhalt springen

ERwin Tipp #002 – GRANT Generierung via Macro

    Dieser ERwin-Tipp beschreibt wie ERwin mit Hilfe eines Macros, ein Post-SQL generiert und auf diese Weise das via Forward-Engineering erstellte DDL-Skript um dynamisch generierte GRANT-Statements erweitert. Hierbei werden nur für jene Datenbank-Objekte GRANTs erzeugt, die auch in die Generierungsauswahl mitaufgenommen wurden. Ferner wird berücksichtigt, dass pro Systemumgebung unterschiedliche technische User in den GRANT-Statements zu berücksichtigen sind.

    ERwin Data Modeler besitzt eine interne Macro-Sprache – na ja – eigentlich sind es zwei unterschiedliche. Die ältere wird nicht weiterentwickelt, ich nenne Sie Legacy-Macro-Sprache. Sie besitzt eine einfache Syntax und einen geringen Funktionsumfang und ist daher schnell einsetzbar. Die „andere“ Macrosprache ist wesentlich komplexer. Sie wird in den Forward-Engineering-Templates eingesetzt, die mit der ERwin-Installation ausgeliefert werden. Dieser Artikel bezieht sich auf die Verwendung der Legacy-Macrosprache.

    Zunächst benötigen eine UDP-Property, in der ein normiertes Kürzel für die jeweilige Systemumgebung hinterlegt wird, für die das DDL-Skript generiert werden soll. Hierzu verwende ich eine UDP auf Ebene „Model“.

    Erwin Dialogfenster, Model Properties, Registerkarte UDP
    Erwin Dialogfenster, Model Properties, Registerkarte UDP

    Ferner stelle ich sicher, dass im Falle eines Forward-Engineering auch Post-SQLs generiert werden:

    ERwin-FE-Prop-Schema-Props-ScriptGen

    Anschließend lege ich ein Script-Template an – dies ist das Macro:

    ERwin-ScriptTemplates-Prop-Macro-Grants

    Nachfolgend nun das Erwin-Macro zur dynamischen Generierung von GRANTs – in Abhängigkeit der gewählten Systemumgebung. Der technische User auf der Entwicklungsumgebung heißt TUCWHE01. „E“ steht für „ENTW“ (Entwicklungsumgebung). „01“ unterscheidet den ETL-User vom read-only Lese-User „02“.

    -- --------------------------------------------------------
    -- ERwin Macro zur Generierung von GRANT-Statements
    -- --------------------------------------------------------
    -- ---------------------------------------------------------------
    -- für Systemumgebung: %DiagramProp(DWH_DEPLOY_ENVIRONMENT)
    -- ---------------------------------------------------------------
    %Decl(vSchemaName,undefined)
    %Decl(vUmgebung,undefined--)
    
    -- Table-GRANTs
    %ForEachEntity() {
     %Switch(%DiagramProp(DWH_DEPLOY_ENVIRONMENT)) {
      %Choose(ENTW) {GRANT SELECT ON %TableOwner.%TableName TO USER tucwhE02; GRANT SELECT, INSERT, UPDATE, DELETE, INDEX ON %TableOwner.%TableName TO USER tucwhE01;}
      %Choose(REF)  {GRANT SELECT ON %TableOwner.%TableName TO USER tucwhR02; GRANT SELECT, INSERT, UPDATE, DELETE, INDEX ON %TableOwner.%TableName TO USER tucwhR01;}
      %Choose(PROD) {GRANT SELECT ON %TableOwner.%TableName TO USER tucwhP02; GRANT SELECT, INSERT, UPDATE, DELETE, INDEX ON %TableOwner.%TableName TO USER tucwhP01;)}
      %Default {%Decl(vUmgebung,UDP_NOT_VALID)}
     }
    }
    -- View-GRANTs
    %ForEachView() {
     %Switch(%DiagramProp(DWH_DEPLOY_ENVIRONMENT)) {
      %Choose(ENTW) {GRANT SELECT ON %TableOwner.%ViewName TO USER tucwhE02;}
      %Choose(REF)  {GRANT SELECT ON %TableOwner.%ViewName TO USER tucwhR02;}
      %Choose(PROD) {GRANT SELECT ON %TableOwner.%ViewName TO USER tucwhP02;}
      %Default {%Decl(vUmgebung,UDP_NOT_VALID)}
     }
    }
    
    -- MView-GRANTs
    %ForEachMatView() {
     %Switch(%DiagramProp(DWH_DEPLOY_ENVIRONMENT)) {
      %Choose(ENTW) {GRANT SELECT ON %TableOwner.%ViewName TO USER tucwhE02; GRANT CONTROL ON %TableOwner.%ViewName TO USER tucwhE01;}
      %Choose(REF)  {GRANT SELECT ON %TableOwner.%ViewName TO USER tucwhRE02; GRANT CONTROL ON %TableOwner.%ViewName TO USER tucwhR01;}
      %Choose(PROD) {GRANT SELECT ON %TableOwner.%ViewName TO USER tucwhP02; GRANT CONTROL ON %TableOwner.%ViewName TO USER tucwhP01;}
      %Default {%Decl(vUmgebung,UDP_NOT_VALID)}
     }
    }

    Etwas tricky: Variablen-Zuweisungen innerhalb einer Schleife, haben nur im Kontext der Schleife Gültigkeit. Auch wenn die Variable vorher außerhalb der Schleifendeklaration deklariert wurde.

    Viel Spaß damit!

    Schlagwörter: