Tags:
create new tag
, view all tags

Datenbank-Trigger

Ausangslage und geplante Änderungen

Datenbank-Trigger sind unerlässlich für viele Synchronisations-Mechansimen. In den Jahren haben sie sich sehr stark vermehrt, allerdings kann mit einer geschickten Namensgebung die Menge gehandhabt werden. Auf einigen Tabellen jedoch, namentlich PERSON, UNAME und EMAIL müssen die Trigger überarbeitet und vereinheitlicht werden.

Im Zuge dieser Überarbeitung sollen auch die Synchronisationsmechanismen vereinfacht werden. Es bringt nicht sehr viel, für jede Tabelle eine UPDATE_ - Tabelle zu haben, welche die Änderung registriert, wenn hinterher bloss nur ein User-Objekt im AD angepasst werden muss. Ausserdem hat sich gezeigt, dass es sinnvoller ist, alle Userobjekte in einer Synchronisationstabelle zu haben und jeweils nur ein Flag auf 1 zu setzen, anstatt für jede Änderung einen Datensatz zu erstellen.

Es ist ebenfalls nicht sinnvoll, für jede Service, welcher synchronisiert werden muss, ein spezifisches Flag einzuführen (z.B. SYNC_LDAPS oder SYNC_AD). Der Lösungsansatz ist nun folgende Synchronisationstabelle SYNC_UNAME:

Feld Beschreibung
NUID Identifikationsnummer des Users
NSID Identifikationsnummer des Services
ZEITSTEMPEL Datum der Änderung
NEEDS_UPDATE Flag, ob ein Userobjekt aktualisiert werden muss

Wenn einem User ein Service gegranted wird, wird durch den Trigger GRANTED_SERVICE_INS_AFT und dem Flag SERVICE.SYNC_UNAME ein Datensatz in obige Tabelle geschrieben. Beim Entziehen dieses Services, wird dieser Datensatz wieder gelöscht ( GRANTED_SERVICE_DEL_AFT). Alle Trigger, welche relevante Änderungen feststellen, schreiben direkt in die SYNC_UNAME Tabelle und setzen alle NEEDS_UPDATE-Flags für diesen User auf 1. Die einzelnen Synchronisations-Jobs ( update_LDAPS.pl, update_AD.pl) setzen diese Flags jeweils wieder auf 0. Typischerweise setzen sie folgendes SQL-Statement ab:

UPDATE sync_uname
SET needs_update = 1
WHERE nuid = ?

Auf diese Weise können Trigger stark vereinfacht werden, da sie sich nicht darum kümmern müssen, ob eine Änderung einen Synchronisation auslöen soll oder nicht. Falls der User keine Services besitzt, ist er auch nicht in der Tabelle SYNC_UNAME vertreten, eine Änderung des Nachnamens hat dann keinen weiteren Effekt. Bekommt der User den Nethz-Service, so werden auf jeden Fall die aktuellen Daten in LDAPS geschrieben. Ausserdem wird ein Datensatz mit NSID=0 erzeugt. Wird der Nachname hinterher geändert, so wird das NEEDS_UPDATE-Flag auf 1 gesetzt und vom Synchronisationsjob abgearbeitet.

PERSON

Trigger-Name Felder Beschreibung Bemerkungen
PERSON_COMPANY_DEPARTMENT_AFT COMPANY
DEPARTMENT
Schreibt bei Änderungen dieser Felder in die Synchronisationstabelle UPDATE_COMPANY_DEPARTMENT  
PERSON_AFFILIATION_AFT IS_* Schreibt bei Änderungen in UPDATE_AFFILIATON und löscht AGID, IS_ANYPERSON, ADMIN_NPID falls Person wieder der ETH angehört  
PERSON_UP_AFT FIRSTNAME
FAMILYNAME
DATE_OF_BIRTH
TITLE
ETH_CARD_NUMBER
MATRIKELNR
EMAIL
Schreibt in UPDATE_PERSON und SYNC_UNAME_TO_LDAPS  
PERSON_PERSID_UP_AFT PERSID Schreibt in UPDATE_PERSON und UPDATE_EMAIL  
PERSON_GUEST_UPDATE_BEF ADMIN_NPID Schreibt in UPDATE_UNAME (für LDAPS) und GUEST_HISTORY, setzt IS_ANYPERSON  
TR_PERSON_PDB PERSID
EMAIL
Schreibt in SS_PDB_AUTH, falls Haupt-Emailadresse geändert hat DONE Umbenannt in PERSON_UP_AFT_PDB
PERSON_PRIMARY_NUID_BEF PRIMARY_NUID Schreibt in SS_PDB_AUTH (Änderung Login sowie E-Mailadresse) sowie UPDATE_UNAME DONE PDB-Teil herauslösen und zu PERSON_UP_AFT_PDB hinzufügen
TR_PERSON_ISG FIRSTNAME
FAMILYNAME
PRIMARY_NUID
EMAIL
ADDR_ROW*
POSTCODE
CITY
PHONE
Schreibt in NETRADIUS.OM_PERSON  

Dies sind viel zu viele Trigger, man hat keine Ahnung, wozu sie alle sind (ohne deren Source-Code zu studieren). Nach der Neu-Organisation werden alle Trigger so bezeichnet, dass ersichtlich ist, wohin sie synchronisieren:

Trigger-Name Felder Beschreibung Bemerkungen
PERSON_UP_AFT_PDB PERSID
URL
Schreibt in SS_PDB_AUTH, falls Änderungen URL, PRIMARY_NUID oder EMAIL geändert haben DONE TODO E-Mail Teil nach EMAIL_UP_AFT_PDB verschieben
PERSON_UP_AFT_LDAPS   Schreibt in SYNC_UNAME_TO_LDAPS DONE TODO in SYNC_UNAME_TO_LDAPS
PERSON_UP_AFT_AD   Schreibt in SYNC_UNAME_TO_AD TODO
PERSON_UP_AFT_ISG   Schreibt in NETRADIUS.OM_PERSON DONE

Einige Felder wie z.B. EMAIL sollten nicht synchronisiert werden, da PERSON nicht die Quelle der E-Mailadressen ist. Es ist sinnvoller, die Tabelle EMAIL mit einem entsprechenden Trigger auszustatten.

EMAIL

bisher
Trigger-Name Felder Beschreibung Bemerkungen
EMAIL_DEL_AFT NUID NOT NULL Schreibt in PERSON.EMAIL sowie UPDATE_EMAIL PL/SQL-Tabelle wird gefüllt und durch EMAIL_UP_DEL_AFT_STMT abgearbeitet
EMAIL_UP_DEL_AFT_STMT   E-Mail Ngroup-Mitgliedschaft wird gelöscht, falls User keine E-Mailadresse in dieser Domäne mehr hat  
EMAIL_ADDRESS_UP_AFT NAME
DOMID
Wenn primäre Adresse geändert hat, PERSON.EMAIL schreiben sowie Eintrag in CHECK_COMPANY_DEPARTMENT Primäre Beziehung zur ETH sollte nicht via E-Mailadresse abgeleitet werden, sondern via entsprechenden Eintrag in der PDB
EMAIL_INS_BEF   TYPE=1, CLASS = 3: Eintrag in UPDATE_EMAIL sowie PERSON.EMAIL. fügt den User zur entsprechenden Ngroup dieser E-Maildomäne hinzu  
EMAIL_UP_AFT_PDB SPAM Schreibt in SS_PDB_AUTH, sobald das SPAM-Flag aktualisiert wurde TODO Falls sich primäre Emailadresse des primären Users geändert hat: dies ebenfalls in SS_PDB_AUTH schreiben
EMAIL_LIST_INS_BEF   CLASS=3, TYPE=1: Falls eine Mailliste noch keine GID besitzt, wird diese zugeteilt Nur Security-Listen sollten GID-Nummern bekommen. Für reine Verteilerlisten ist dies unnötig

neu

Trigger-Name Felder Beschreibung Bemerkungen
EMAIL_UP_AFT_PERSON   Schreibt in SYNC_EMAIL_TO_PERSON Es gibt verschiedene Gründe, weshalb die Hauptadresse einer Person ändert: Wechsel der primären E-Mailadresse, Wechsel des primären Usernamens, Verschieben eines Usernamens zu einer anderen Person, Löschen des primären Usernamens, Löschen des Mailbox-Services, hinzufügen einer persönlichen E-Mailadresse. In allen Fällen soll «die» E-Mailadresse angepasst werden.
EMAIL_UP_AFT_LDAPS TYPE=1 Schreibt in SYNC_UNAME_TO_LDAPS Betrifft alle primären E-Mailadressen einer Person
EMAIL_UP_AFT_NGROUP   Schreibt in SYNC_EMAIL_TO_NGROUP (für Ngroup-Mitgliedschaften)  
EMAIL_UP_AFT_PDB   Schreibt in SS_PDB_AUTH  
EMAIL_MAILLIST_DEL_AFT    Löschen von Email-Listen
EMAIL_MAILBOX_DEL_AFT   Schreibt in UPDATE_EMAIL
EMAIL_EXTERN_DEL_AFT   Löschen von Personen-bezogenen E-Mail-Adressen

Uname

bisher
Trigger-Name Felder Beschreibung Bemerkungen
UNAME_INS_BEF   Setzt für jeden Usernamen eine UUID DONE (ok)
UNAME_INS_AFT   Schreibt in SS_PDB_AUTH DONE (ok)
UNAME_UP_AFT   Schreibt in NETRADIUS.OM_PERSON, UPDATE_UNAME, PERSON.PRIMARY_NUID sowie UNAME_HISTORY Trigger sollte in differenziertere Trigger aufgeteilt werden
UNAME_DEL_AFT   Schreibt in UNAME_HISTORY.S etzt PRIMARY_NUID auf NULL, falls dieser User der primäre User der Person gewesen ist  

neu

Trigger-Name Felder Beschreibung Bemerkungen
UNAME_UP_AFT_PERSON    
UNAME_UP_AFT_LDAPS   Schreibt in SYNC_UNAME_TO_LDAPS Änderung der UID, GID
UNAME_UP_AFT_AD   Schreibt in SYNC_UNAME_TO_AD Änderung der UID, GID
UNAME_DEL_AFT_PERSON   Setzt PRIMARY_NUID auf NULL, falls dieser User der primäre User der Person gewesen ist  

To Do

  • DONE Tabelle SERVICE um das Feld SYNC_UNAME erweitern
  • TODO Nethz::Auth::PosixAccount durch eine Funktion à la Auth_SM::update_entry erweitern
  • TODO Nethz::AD::PosixAccount durch eine Funktion wie oben erweitern
  • DONE update_LDAPS.pl überarbeiten und Tabelle SYNC_UNAME abarbeiten
  • TODO update_AD.pl überarbeiten und Tabelle SYNC_UNAME abarbeiten
  • TODO alle Trigger so umschreiben, dass sie nur noch SYNC_UNAME füllen
    • DONE ADRESSE_* Trigger
    • PERSON_AFFILIATION_AFT
    • PERSON_COMPANY_DEPARTMENT_AFT
    • DONE EINSCHREIBUNG_*
    • DONE IMMATRIKULATION_*
    • EMAIL_DEL_AFT
    • EMAIL_ADDRESS_UP_AFT
    • EMAIL_INS_BEF
    • PERSON_PERSID_UP_AFT
    • DONE BEZIEHUNG_*
    • DONE ORG_FUNKTIONSTRAEGER_*
  • TODO Tabellen löschen
    • UPDATE_UNAME
    • UPDATE_PERSON
    • UPDATE_IMMATRIKULATION
    • UPDATE_EINSCHREIBUNG
    • UPDATE_EMAIL (Kolonnen SYNC_LDAPS und SYNC_LDAP)
    • UPDATE_COMPANY_DEPARTMENT
    • UPDATE_AFFILIATION
    • UPDATE_ADRESSE
  • DONE Trigger in GRANTED_SERVICE
    • GRANTED_SERVICE_INS_AFT: automatischer Eintrag in SYNC_UNAME unter Beachtung von SERVICE.SYNC_UNAME
    • GRANTED_SERVICE_DEL_AFT: Eintrag in SYNC_UNAME löschen, sofern vorhanden
  • neue Felder in PERSON
    • DONE PERSKAT (Hauptbeziehung)
    • DONE KEIN_ADRESSVERKAUF (für Studentenlisten / ETH Career Center)
    • TODO COMPANY und DEPARTMENT gemäss PERSKAT generieren, nicht mehr via E-Mail-Adresse!
  • Trigger in PERSON anpassen
    • DONE PERSON_AFFILIATION_AFT löschen (wird neu von MAP_BEZIEHUNG_TO_PERSON ausgeführt)
  • TODO obsolete Synchronisationstabellen abbauen
    • UPDATE_UNAME
    • UPDATE_PERSON
    • UPDATE_AFFILIATION
    • UPDATE_BEZIEHUNG
    • UPDATE_ADRESSE
    • UPDATE_ADDRESS
    • UPDATE_ANSTELLUNG (DONE SYNC_ALADIN, SYNC_PERSON)
    • UPDATE_COMPANY_DEPARTMENT
    • UPDATE_EINSCHREIBUNG
    • UPDATE_IMMATRIKULATION
    • UPDATE_EMAIL
  • TODO Prozeduren überarbeiten
    • GET_COMPANY_DEPARTMENT aufgrund von Hauptbeziehung PERSON.PERSKAT ermitteln, nicht aufgrund der primären E-Mail-Adresse.
    • DO_CHECK_COMPANY_DEPARTMENT (durch Trigger auf PERSON.PERSKAT ersetzen)
    • DONE SYNC_PERSON neue Felder PERSKAT und KEIN_ADRESSVERKAUF
  • TODO obsolete Prozeduren
    • DONE CREATE_PERSON

-- SwenVermeul - 2011-10-18

Topic revision: r9 - 2011-10-31 - vermeul
 
This site is powered by the TWiki collaboration platform Powered by PerlCopyright © 2008-2017 by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki? Send feedback