Java & MySQL

Man könnte das ganze doch durch Views lösen!? Jeder Benutzer bekommt einen View auf die Daten mit seiner ID. Dort auch SELECT, INSERT und UPDATE Rechte.

Gruß

Romsl
 
Für Selects und Updates gebe ich Dir Recht, das ließe sich möglicherweise durch Views absichern, daran hatte ich nicht gedacht.
Wie schon angedeutet, habe ich mich noch nicht eingehend mit MySQL 5 befasst.
Nach dem, was ich mir eben aus der Doku zusammengelesen habe, bin ich aber der Meinung, dass man Inserts (Gefahr: etwas in fremdem Namen eintragen) damit auch nicht absichern kann.
Ich würde mich über ein kurzes Beispiel freuen, was mir das Gegenteil zeigt.
Wäre zum Beispiel Folgendes (die Syntax ist bestimmt falsch) mit Rechten an dem View möglich?
SQL:
CREATE VIEW hpvwOutgoingPN AS
  SELECT 
    recipient,
    message
  FROM pn
  WHERE sender='hpvw';
INSERT INTO hpvwOutgoingPN set 
  recipient='Romsl',
  message='Hello';
(Wie gesagt, bin ich mir über die Syntax nicht im Klaren.)
In der Tabelle pn müsste dann folgende Zeile stehen:
Code:
sender recipient message
hpvw   Romsl     Hello
Dann nehme ich alles zurück und behaupte mit Freude das Gegenteil. (Das ist keine Ironie.)

EDIT: Das Gegenteil ist in Post 14 beschrieben.

Gruß hpvw
 
Zuletzt bearbeitet:
Danke, dass Du mich an die richtige Stelle in der Doku geschoben hast.
Es ist tatsächlich auch mit Insert-Queries möglich.
Allerdings erfordert die im Folgenden dargestellte Vorgehensweise noch einen recht hohen administrativen Aufwand, da jeder User seine eigenen Views benötigt. Es ist nach Ansätzen, die ich in der Doku gesehen habe, wohl auch möglich (evtl. mit Hilfe von Stored Procedures, aber vielleicht genügt die Funktion CURRENT_USER()) einen View für alle User auf den angemeldeten User einzuschränken. Dann "beschränkt" sich der administrative Aufwand auf die korrekte Vergabe von Rechten an den Views.

Hier mein gelungener Versuch (zwar noch als root, aber mit den entsprechenden Userrechten "leicht" zu erweitern):
Code:
mysql> select * from pn;
+----+--------+----------+------------+
| id | sender | reciever | message    |
+----+--------+----------+------------+
|  2 | hans   | otto     | hello otto |
|  3 | otto   | marc     | hello marc |
+----+--------+----------+------------+
2 rows in set (0.01 sec)

mysql> create view ottoOut as
    -> select * from pn
    ->   where sender='otto'
    -> with check option;
Query OK, 0 rows affected (0.00 sec)

mysql> create view ottoIn as
    -> select * from pn
    ->   where reciever='otto'
    -> with check option;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from ottoOut;
+----+--------+----------+------------+
| id | sender | reciever | message    |
+----+--------+----------+------------+
|  3 | otto   | marc     | hello marc |
+----+--------+----------+------------+
1 row in set (0.00 sec)

mysql> select * from ottoIn;
+----+--------+----------+------------+
| id | sender | reciever | message    |
+----+--------+----------+------------+
|  2 | hans   | otto     | hello otto |
+----+--------+----------+------------+
1 row in set (0.01 sec)

mysql> insert into ottoOut set
    -> sender='otto',
    -> reciever='hans',
    -> message='hello hans';
Query OK, 1 row affected (0.41 sec)

mysql> insert into ottoOut set
    -> sender='hans',
    -> reciever='marc',
    -> message='hello marc';
ERROR 1369 (HY000): CHECK OPTION failed 'pn.ottoout'
mysql> select * from pn;
+----+--------+----------+------------+
| id | sender | reciever | message    |
+----+--------+----------+------------+
|  2 | hans   | otto     | hello otto |
|  3 | otto   | marc     | hello marc |
|  4 | otto   | hans     | hello hans |
+----+--------+----------+------------+
3 rows in set (0.00 sec)

mysql> select * from ottoOut;
+----+--------+----------+------------+
| id | sender | reciever | message    |
+----+--------+----------+------------+
|  3 | otto   | marc     | hello marc |
|  4 | otto   | hans     | hello hans |
+----+--------+----------+------------+
2 rows in set (0.01 sec)

mysql> select * from ottoIn;
+----+--------+----------+------------+
| id | sender | reciever | message    |
+----+--------+----------+------------+
|  2 | hans   | otto     | hello otto |
+----+--------+----------+------------+
1 row in set (0.00 sec)
(PS: Nachdem ich mich beim ersten Eintrag vertippt habe, wurde die Tabelle nicht nochmal neu angelegt, daher startet die ID mit 2.)

Gruß hpvw

EDIT: Da dieses Vorgehen MySQL 5.0.2 und tiefe Eingriffe in die Benutzerverwaltung erfordert, wird man derzeit wohl nicht um einen selbst administrierten Server herum kommen. Ich denke, bei einer etwas umfangreicheren Tabellenstruktur muss man auch noch eine Menge Arbeit in die Planung der Rechte stecken. Einfach wird das sicher nicht.

EDIT:
Romsl hat gesagt.:
Vielleicht sollte man das ganze mal im DB Forum behandeln.
Da hast Du schon wieder Recht. Vielleicht findet ja einer der Mods einen eleganten Weg, das Thema zu teilen oder kann es verschieben.
 
Zuletzt bearbeitet:
Zurück