Einzelnen Beitrag anzeigen

Zwirbel

Registriert seit: 17. Aug 2009
66 Beiträge
 
Delphi 11 Alexandria
 
#1

Nicht mit SYSDBA arbeiten, aber wie sonst?

  Alt 8. Sep 2016, 19:41
Datenbank: Firebird • Version: 3 • Zugriff über: Seattle
Nicht mit SYSDBA arbeiten, aber wie sonst?

Hallo,

die Hinweise unter Firebird nicht mit dem SYSDBA-User zu arbeiten und das Kennwort sofort nach der Installation zu ändern sind nicht zu übersehen. Am Anfang erleichtert es sicherlich den Einstieg es doch erst mal damit zu belassen. Die Phase habe ich nun hinter mir und möchte doch gerne eine Umgebung aufbauen, wie man sie auch später bei einem Kunden ausliefern wird. Da fehlt mir allerdings immer noch der Überblick wie man da eigentlich vorgeht. Man muss ja davon ausgehen, dass die Datenbank und die Anwendung von einer IT-Person des Kunden installiert wird. Ergo muss alles soweit vorbereitet sein, dass diese Person in einem Install-Programm einen beliebigen Usernamen und ein Passwort verwenden kann, mit dem dann das Installationsprogramm die eigentliche Firebird-Datenbank anlegt.

Gehen wir mal davon aus der Kunde hat keine Firebird-Infrastruktur aufzuweisen. Dann hat man die Situation, dass direkt nach der Installation von Firebird der User "SYSDBA" mit dem wohlbekannten Kennwort aktiv ist. Dann würde das Installationsprogramm also die IT-Person "SYSDBA" und "masterkey" eingeben lassen und das Installationsprogramm würde mindestens einen weiteren neuen User anlegen, besser zwei.

Mal ein wenig Pseudocode:
Delphi-Quellcode:
  procedure CheckAndCreateUser(const aUserName, aPassword, aFirstName, aMiddleName, aLastName : AnsiString);
    { Prüft ob der User »aUserName« schon in der Securitydatenbank angelegt ist.
      Wenn nicht, wird der User »aUserName« mit den Angaben aus »aPassword«,
      »aFirstName«, »aMiddleName« und »aLastName« angelgt. }

  begin
    ibSecurity.AUserName := aUserName;
    ibSecurity.DisplayUser;
    if ibSecurity.AFirstName = 'then begin
      ibSecurity.AUserName := aUserName;
      ibSecurity.APassword := aPassword;
      ibSecurity.AFirstName := aFirstName;
      ibSecurity.AMiddleName := aMiddleName;
      ibSecurity.ALastName := aLastName;
      ibSecurity.ARoleName := 'ADMIN';
      ibSecurity.AddUser;
    end;
  end;

  ibSecurity.DriverLink := FDPhysFBDriverLink;
  ibSecurity.UserName := 'SYSDBA';
  ibSecurity.Password := 'masterkey';
  ibSecurity.Host := '';

  CheckAndCreateUser('CUSTOMER', 'geheim', 'Max', 'M.', 'Mustermann'); // Das ist der Account für die IT-Person des Kunden
  CheckAndCreateUser('MARKUSD', 'ganzgeheim', 'Markus', '', 'D'); // Das ist der Account für uns, den Hersteller der Applikation
Allerdings sind das nun zwei Firebird-User die nicht sonderlich viel können, auf jeden Fall keine Datenbank anlegen, keine Tabellen etc (das "ibSecurity.ARoleName := 'ADMIN';" bringt nix, vllt. ist es aber auch falsch). Sinn und Zweck soll ja sein, dass eine FB-Datenbank angelegt wird, wo prinzipiell nur jemand von der IT-Abteilung des Kunden drauf kann (das wäre in meinem obigen Beispiel der user "CUSTOMER") und natürlich wir als Hersteller auch, das wäre der user "MARKUSD". Das Kennwort für den user "CUSTOMER" teilt man der IT-Person mit, falls der sich genötigt sieht, mal in die Datenbank zu schauen. Unser Kennwort erfährt niemand. Da ich mich mit den weitreichenden Rechten in einer FB-Datenbank noch nicht auskenne, weiß ich noch nicht, ob es notwendig ist der IT-Person beschränkte Rechte zu erteilen. Aber wenn es einen eigenen User gibt, dann kann man das tun, wenn es sinnvoll erscheint.

Wie lege ich nun, vorzugsweise mit Delphi, einen FB-User an, der rechtemäßig so ausgestattet ist, dass er dann eine Datenbank anlegen kann?

Wie man einen User per Hand mit SQL anlegt weiß ich:

CREATE USER MARKUSD PASSWORD 'ganzgeheim' FIRSTNAME 'Markus' LASTNAME 'D' ACTIVE GRANT ADMIN ROLE; Aber wenn ich das so nackt im ISQL absetze kriege ich die Meldung:

Use CONNECT or CREATE DATABASE to specify a database Was müsste man denn im ISQL erst mal tun, um dann berechtigt zu sein, ein "CREATE USER ..." überhaupt abesetzen zu dürfen? Solche trivial anmutenden Fragen werden leider in der Lektüre "The Firebird Book" von Helen Borrie nicht erklärt, was ziemlich enttäuschend ist.

in gsec funktioniert zumindest das:
Delphi-Quellcode:
C:\Program Files\Firebird\Firebird_3_0>gsec -user sysdba -password masterkey
*** gsec is deprecated, will be removed soon ***

GSEC> add MARKUSD -pw ganzgeheim -fname MARKUS -lname D -admin yes
GSEC> quit

C:\Program Files\Firebird\Firebird_3_0>
Aber auch das nutzt nix, wenn ich dann versuche mit dem User "MARKUSD" eine Datenbank zu erzeugen:
Delphi-Quellcode:
CREATE DATABASE 'P3400M-W10/3050:C:\AM\Client\BLL\AM_FB_CLIENT.FDB'
USER 'MARKUSD' PASSWORD 'ganzgeheim'
PAGE_SIZE 16384
DEFAULT CHARACTER SET UTF8 COLLATION UTF8;
COMMIT;
schlägt das fehl:
Unsuccessful execution caused by system error that does not preclude successful execution of subsequent statements.
Error loading plugin Engine12.
Module C:\Program Files\Firebird\Firebird_3_0\plugins/Engine12 exists but can not be loaded.

Vielen Dank im Voraus. Gruß, Markus
  Mit Zitat antworten Zitat