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“.
Ferner stelle ich sicher, dass im Falle eines Forward-Engineering auch Post-SQLs generiert werden:
Anschließend lege ich ein Script-Template an – dies ist das Macro:
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!