Hallo Forum,
heute habe ich mich versucht in Datenbanken einzulesen und hätte vorerst eine Frage zum Design eines Programmes mit einer Datenbankverbindung.
1. Bisher habe ich kleinere Programme erstellt, bei dem man mittels einer properties Datei die Zugangsdaten zu einer Datenbank angeben konnte.
Wie schaut es jedoch aus, wenn der Benutzer oder sogar mal der Kunde keine Zugangsdaten sehen sollte. Dann könnte man es zwar "hart" in den Javacode schreiben. Man kann aber Javacode dekompilieren oder könnte bei Java/JSP die JSP-Seiten evtl. so erweitern, dass man über die JSP-Seite eine Datenbankverbindung aufbaut und so Inhalt auslesen kann. Was könnte man hier machen?(Der Sinn des Schutzes der Datenbank sei mal dahingestellt)
Diese Frage stelle ich mir, falls der Entwickler bestimmte Daten für eine Datenbank zukauft (EAN Codes, Geografiedatenbank, Schuldatenbank) und eine Applikation dazu schreibt. Habe mich auch schon in Datenbankberechtigungen GRANT eingelesen, bei der man bestimmte Funktionen untersagen kann. Die Applikation selber braucht aber bestimmte Funktionen. Und wenn ein Endbenutzer die Zugangsdaten für die Datenbank einesehen könnte über die properties zum Beispiel, würde er den Inhalt der Datenbank problemlos auf einen Schlag kopieren können oder keine Ahnung was man da anstellen kann. (Wie gesagt, ich möchte da jetzt keinen Kunden oder Benutzer einschränken, sondern darum, was man beachten sollte, wenn es sich mal um etwas sensiblere Daten handeln würde)
2. Habe mir Trigger und Stored Prozedures angeschaut. Der Unterschied wäre ja, dass man einen Trigger (Bsp. Select, Insert) anlegt und einer Tabelle zuordnet. Sobald nun ein Select auf diese Tabelle erfolgt, wird der Trigger aufgerufen. Bei Stored Prozedures hingegen, wird die Prozedur von der Applikation aufgerufen, die dann erst den Select, Insert, was auch immer aufruft. Sollte man mit Grant ein Insert verbieten, würde er auch die Stored Prozedure mit einem Insert verbieten ne?
Wäre alles richtig, was ich von mir gegeben habe?
3. Wobei ich nicht fündig wurde, ist "(+)" und "SELECT NULL .. from..."
Vielleicht gebe ich das (+) auch nur falsch bei Google ein. Für was steht dieses (+), wenn man dies bei einer SQL (zum Beispiel in der where Verbindung) angibt? Oder ich frage mich, was ein SELECT NULL bezweckt?
4. Ist die Perfomance bei eienr ORACLE Datenbank durch die Trennung von Datendaten und Tablespaces eigentlich nicht schlechter, anstatt wenn man diese Trennung nicht hätte?
5. Über das Befehl "STORAGE(INITIAL 1234567 NEXT 12345678 PCTINCREASE 300)" wurde ich auch nicht fündig.
6. ~~~sql
insert into test ( id, text )
select rownum, 'Blabla' || to_Char(rownum)
from all_objects
where rownum <= 1000;
commit;
Irgendwie verstehe ich das Select in dem INSERT INTO nicht. Er selectiert rownum, und 'Blabla" oder rownum in einen Buchstaben abgewandelt?
7\. Sind wieder leider viele Fragen geworden. Aber folgende SQL ist gegeben:
~~~sql
select first.*, second.*
from db_first first, db_second second
where first.id = second.id
and second.adate= (
select max( adate)
from db_second
where id = first.id
and adate <= sysdate
);
In der Tabelle first gibt es nur die Spalte ID, Name und in second auch eine ID und ein aDate.
Nun soll folgende Query doppelt so schnell sein:
select first.*, second.*
from db_first first,
( select *
from ( select bla.*, max( adate) over ( partition by id ) max_date from db_second bla )
where adate= max_date
) second
where first.id = second.id (+);
Liegt das daran, dass er im oberen Beispiel für jede Zeile aus der Tabelle first jedesmal ein Select ausführen muss, wohingegen er beim zweiten, das nur einmal im FROM tut, bzw. zweimal. Wobei mir das "OVER" auch überhaupt nichts sagt (Irgend eine Fensterrangfunktion, wo ich noch kein Beispiel dafür gefunden habe)
Es gab zwar noch dieses Beispiel, aber da muss ich mich in Bindvariable einlesen, für was das gut ist:
select first.*, second.*
from db_first first,
(
select * from
(
select *
from second
where id = :Bindvariable
and adate <= sysdate
order by adate desc
)
where rownum = 1
) second
where first.id = second.id (+);
Viele Grüße