Ilja: Datenbank/Scriptsicherheit Datenbankfunktionen

Beitrag lesen

moin,

  1. 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.

weniger von einem SELECT, mehr von DML befehlen wie INSERT, UPDATE und DELETE.

Bei Stored Prozedures hingegen, wird die Prozedur von der Applikation aufgerufen, die dann erst den Select, Insert, was auch immer aufruft.

es muss nicht immer eine applikation sein, die eine stored procedure aufruft. jeder der auf irgendeine weise zugriff auf die datenbank hat und die sp ausführen darf, kann sie aufrufen.

  1. 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?

das (+) Zeichen ist ein relikt von oracle aus alten zeiten, es war vor 9i der einzige weg in oracle OUTER JOINS zu bilden. mit 9i hat oracle sich der schreibweise von ANSI SQL angepasst, sprich du kannst nun auch in oracle LEFT JOIN schreiben anstelle in der WHERE klausel die (+) schreibweise zu benutzen.

Oder ich frage mich, was ein SELECT NULL bezweckt?

NULL ist in kontext von datenbanken ein besonderer wert. er wird unterschiedlich interpretiert. ich empfehle immer nur eine interpretation und zwar immer, nämlich das der wert für keine information steht, sprich es ist keine aussage über den inhalt möglich. man könnte auch sagen unbekannt. SELECT NULL ist zum beispiel bei unterabfragen in kombination mit EXISTS abfragen interessant. da spielt es dann keine rolle, ob in der unterabfrage werte zurückzugeben werden. alleine die tatasache, ob es einen datensatz gbt ist dabei interessant, aber nicht welchen wert irgendeine spalte hat.

SELECT t1.*
FROM tablle1 t1
WHERE EXISTS (SELECT NULL
              FROM tabelle2 t2
              WHERE t2.id = t1.id
             )
;

  1. 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?

was sind den datendaten oder meinst du datendateien ? grundsätzlich stehen tablespaces anders in verbindung zu datendateien, nämlich ein tablespace hat ein oder mehre datendateien und eine datendatei gehört genau zu einem tablespace. ein tablespace kann mal also als gruppierung von datendateien ansehen.

  1. Über das Befehl "STORAGE(INITIAL 1234567 NEXT 12345678 PCTINCREASE 300)" wurde ich auch nicht fündig.

wenn du mal ohne die spezifischen zahlen suchst, wirst du viele treffer haben. grundsätzlich ist es die erweiterung einer CREATE anweisung, die objekte wie tabellen oder indexe erstellt und du damit angeben  kannst, wie sich die speicherung des objektes verhält, zum beispiel wie groß die erste speichereinheit (extent) ist, wie groß die folegende, ob sie dynamisch immer größer werden, etc.

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?  
  
grundsätzlich kann man die daten, die an in einer abfrage selektiert auch gleich in eine tabelle einfügen. dazu mussse die anzahl der spalten übereinstimmen und auch die datentypen. rownum ist eine pseudospalte in oracle, sie nummeriert die ergebnisdatensätze hoch. dabei wird am text 'Blabla' zusätzlich die ROWNUM hinten "angeklebt", sprich zum beispiel  'Blabla1', 'Blabla2', etc.. ROWNUM kann auch in der WHERE klausel benutzt werden, allerdings ist diese verwendung ein wenig tricky, da kann man leicht was falsch machen.  
  

> Nun soll folgende Query doppelt so schnell sein:  
  
die beiden abfragen können meiner meinung auch unterschiedliche ergebnise liefern, insofern hinkt ein vergleich.  
  

> Es gab zwar noch dieses Beispiel, aber da muss ich mich in Bindvariable einlesen, für was das gut ist:  
  
bindvariablen sind wichtig, damit das dbms die abfrage mit unterschiedlichen parametern als gleiche abfrage deutet, sprich nicht immer wieder neu parsen muss. das kann einen nicht unerheblichen geschwindigkeitzsvorteil bringen.  
  
Ilja