Zum Inhalt springen

dr.dimitri

Mitglieder
  • Gesamte Inhalte

    1.276
  • Benutzer seit

  • Letzter Besuch

Beiträge von dr.dimitri

  1. Die PG Techniken sind mir nicht bekannt, aber die Triggerlösung ist definitiv nicht multiuserfähig, da unterschiedliche Sessions die uncomitteten Einträge der anderen nicht sehen können und es daher früher oder später zu Überbuchungen kommt.

    Ich würde hier wie folgt vorgehen:

    Angeommen, es gibt eine Tabelle ZIMMER, wird bei jedem Buchungsversuch der entsprechende Eintrag in dieser Tabelle mittels SELECT ... FOR UPDATE gelockt. Jetzt hat man dieses Zimmer im exclusiven Zugriff und kann seine Buchungsdaten speichern.

    Eine andere Session würde jetzt erstmal warten, bis der neue Eintrag comittet ist, den Datensatz wieder sperren, evtl. feststellen, dass der vorher noch als frei angezeigte Zeitraum mittlerweile belegt ist und mit einer entsprechenden Meldung abbrechen.

    Das ganze wird natürlich optimistisch gelockt, sprich der Lock auf das Zimmer erfolgt erst, wenn über die Anwendung die Daten schon fix und fertig eingegeben sind und der Anwender auf Speichern klickt.

    Man könnte es auch noch eleganter machen, und in der Tabelle ZIMMER einen Änderungszähler hinterlegen, der jedesmal hochgezählt wird, wenn eine Buchung erfolgt. Ist der Änderungszähler, der während des erstmaligen Ladens des Zimmers für die Anzeige in der AW gelesen wurde, identisch mit dem Zähler der beim Locken in der Tabelle steht, muss ich keine vorherige Prüfung laufen lassen, ob der Zeitraum noch frei ist und spare mir damit etwas Zeit und CPU.

    Und im übrigen: Keine Anwendungslogik in Triggern hinterlegen :mod:

    Dim

  2. Der Ansatz ist ein bissl verquer. Wieso legst Du die View nicht einmalig an und schränkst dann nur über die WHERE Abfrage ein? Fertig.

    Falls das ganze komplett in PL/SQL laufen soll, wäre auch noch die Möglichkeit das Ergebnis als REF CURSOR zurückzugeben.

    Im aufrufenden Programm bekommt man das als ResultSet, RecordSet oder wie immer man es in der jeweiligen Sprache auch nennt zurück.

    Das ganze würde dann wie folgt aussehen:

    CREATE OR REPLACE FUNCTION STAMMDATEN_bearbeiten (p_id VARCHAR2)  RETURN  SYS_REFCURSOR IS
    
      l_retVal SYS_REFCURSOR;
    
    BEGIN
    
     OPEN l_retVal FOR 'SELECT * FROM tabelle WHERE id=:1' USING p_id;
    
     RETURN l_retVal;
    
    END;

    Damit lieferst Du die Ergebnismenge bzw. besser gesagt einen Zeiger darauf, an den Aurufer zurück. Wie das dann konkret im Programm aussieht ist je nach Sprache etwas anders, aber dafür gibt es dann die Doku.

    Dim

    PS: Wieso heißt es stammdaten_bearbeiten wenn das Ergebnis einer Abfrage zurückgegeben wird?

  3. Ich werde Dir kein fertiges Statement vorkauen, denn wenn man subselect in Verbindung mit mySQL in eine Suchmaschine eingibt findet man tausende Seite mit Informatione
    Stichwort Soziale Kompetenz als Moderator.

    Zum eigentlichen Problem:

    Ich würde hier eher das Stichwort Pivotieren verwenden. Das ist, sofern die DB hier keinen speziellen Befehl hat nicht ganz so einfach, besonders, da Du evtl. eine unbestimmte Menge an Spalten hast.

    Wie man mit Subselects eine unbekannte Menge von Ausprägungen pivotiert würde ich gerne sehen - man lernt ja nie aus.

    Sofern hier kein anderer Kollege entsprechende Erfahrung hat (mysql ist nicht unbedingt "meine" DB) und ein "vorgekautes" Beispiel hat, würde sicherlich auch eine Suche in der oben schon genannter Suchmaschine helfen.

    Dim

  4. Hi,

    nachdem ich umziehe, wird auch meine Bibliothek wieder etwas ausgemistet. Folgendes Buch würde ich an einen Interessenten verschenken:

    Oracle Expert One On One (allerdings nicht die signierte Version)

    Da ich auch noch eine kostenlose Paketmarke gefunden hab, wäre auch der Versand frei Haus.

    Wer also ehrliches Interesse an dem Buch hat und diese nicht sofort bei Amazon oder Ebay einstellt, sowie durch seine Aktivität in der letzten Zeit hier belegen kann, dass er sich intensiver mit Oracle beschäftigen will/muss soll mir einfach eine PM schreiben.

    Dim

  5. Ein kurzer Blick in die Oracledoku hätte Dir verraten, dass diese syntax falsch ist (zumindest für Oracle).

    Korrekt wäre:

    
    with [I]alias[/I] as (select ...), [I]alias2[/I] as (select ...), [I]alias3[/I] as (select ...)

    So ein Konstrukt habe ich als Inline View über google gefunden. Was mach ich da verkehrt?
    Dann war sicherlich keines dieser Konstrukte unter Oracle lauffähig. MSSQL vielleicht oder DB2.

    Dieses Konstrukt nennt sich übrigends Subquery Factoring und nicht Inline View. Eine Inline View (oder Subquery) kommt nach der FROM Klausel.

    Dim

  6. Dann schreib Dir ein kleines Skript welches das für Dich erledigt. Die Tabelle kannst ja stehen lassen und nach getaner Arbeit wieder leeren.

    Davon abgesehen: Wie dürfen wir Dich den fachlich einordnen? hast Du schon mal was mit Datenbanken gemacht? Bist Du überhaupt Entwickler oder hast die Aufgabe von jemand anderem geerbt?

    Dim

  7. Hi,

    leg Dir eine zweite Tabelle an, die die gleiche Struktur wie die Zieltabelle besitzt, anschließen importierst Du die komplette csv Datei in diese Tabelle und filterst dann alle Sätze aus, die es in der Zieltabelle nicht schon gibt:

    INSERT INTO zieltabelle SELECT * FROM temptabelle a WHERE NOT EXISTS(SELECT 1 FROM zieltabelle b WHERE a.id=b.id)

    Um das vorab zu prüfen, kannst das INSERT INTO ja auch weglassen und nur mal das Select ausführen um zu sehen, ob Du es auch richtig gemacht hast.

    Dim

  8. Allerdings glaube ich, dass als guter BA mehr Berufserfahrung und in verschiedenen Funktionen benötigt wird.

    Ja klar. Ein BA bei einer Versicherung hat andere fachliche Kenntnisse als bei einem Chemiekonzern - egal wieviele Jahre er dort war.

    Zur Berufserfahrung gehören desweiteren auch die sog. Softskills, die u.a. eben auch den Unterschied zu einem Azubi oder einem frischen Uni/FH Absolventen machen.

    Die Juniorstelle wurde ja schon angesprochen.

    Dim

  9. Die natürlich nicht mehr "zählen", wenn Du in ein anderes Berufsfeld einsteigst!
    Da BAs idealerweise auch Erfahrungen in der IT besitzen (sie fungieren u.a. als Schnittstelle zwsichen IT und Fachbereich und müssen daher beide Sprachen verstehen) - warum bitte sollten diese 2 Jahre plötzlich nicht mehr zählen?

    Bei uns sind BAs z.B. direkt in der IT angesiedelt, viele waren ehemals Entwickler und seit neuesem werden gezielt BAs auch ausgebildet (Informatikkaufmann).

    Dim

  10. Das nennt sich referentielle Integrität (oft auch abgekürzt RI genannt), die bei mysql, wie schon erwähnt, mit der InnoDB Engine, nicht aber mit der myisam Engine implementiert ist.

    Weitere Begriffe nach denen Du suchen kannst sind Primary Key und Foreign Key.

    Dim

  11. über 2-3 stunden die für uns interessant wären.

    Viel zu lange. 15-20 Minuten bei einem aussagekräftigem Workload reichen vollkommen.

    unsere cache treffer und solches Zeug. sieht alles gut aus.

    Die Buffer Cache Hit Ration ist relativ nichtssagend. Es gibt sogar ein kleines Tool, mit dem man sich seine Wunsch Hit ration selbst erzeugen kann. Über die Performance sagt das relativ wenig aus.

    Interessanter sind die Top 5 Statements, ob es dort evtl. Verbesserungspotential gibt bzw. ob Dir bei den Top 5 Wait Events etwas seltsam vorkommt.

    Dabei spielt es natürlich auch eine wichtige Rolle, wie die Datenbank verwendet wird. Ein OLAP System sieht anders aus als eine OLTP Instance.

    Dim

  12. kenn jemand ein paar faustregeln wie man diese reports aufbereitet?

    Ja, die kannst direkt wegschmeißen, oder noch besser zurückschicken und das Geld dafür zurückverlangen.

    Einen Statspackreport zu ziehen ist dann sinnvoll, wenn man ein konkretes Problem hat, und in einem bestimmten Zeitraum (15-20 Minuten nicht Stunden oder Tage) wissen möchte, was auf der DB genau los ist. Das ist dann auch deutlich überschaubarer (ca. 1-20 Seiten je nach Aktivität).

    Sofern Du also kein konkretes Performanceproblem hast, würd ich auch keinen Statspackreport lesen - außer Du hast zuviel Zeit. Des weiteren würd ich bei den Admins mal nachfragen, was die sich dabei gedacht haben und dass sie sich die 100 Seiten sonst wo hinschieben können :D

    Dim

    PS: Über welchen Zeitraum ging denn der Report?

  13. Eine andere Möglichkeit ist es, Dir die benötigte Menge über ein Subselect zur Verfügung zu stellen. Allerdings kenne ich die Datumsfunktionen von MSSQL nicht, aber in Oracle liefert dieses SQL z.B. alle Monate eines Jahres:

    SELECT ADD_MONTHS (TRUNC (SYSDATE, 'YY'), ROWNUM - 1) datum
    
      FROM all_objects
    
     WHERE ROWNUM < 13

    Dim

  14. select nummer, anzahl from knurpsel group by nummer, anzahl

    Ist eine Möglichkeit, aber tihadi war ja schon auf dem richtigen Weg:

    select distinct nummer,anzahl from knurpsel

    Per Definition muss in einer Datenbank jede Zeile eindeutig sein, was bei deiner nicht der Fall ist.

    Auf technischer Ebene ja, aber das stellt die Datenbank sicher (Oracle z.B. über die Rowid). Ansonsten muss überhaupt nichts eindeutig sein, ebensowenig muss eine Tabelle einen PK besitzen.

    Dim

  15. Was genau möchtest Du denn eigentlich machen? Es gibt keinen x-ten Eintrag in einer Tabelle. Dort ist alles kunterbunt gemischt. Ebenso gibt es keine fortlaufende Nummer. ROWNUM ist eine Pseudospalte, die von Oracle an eine zeile vergeben wird, wenn die WHERE Bedingung erfüllt ist.

    ROWID wiederum ist etwas völlig anderes und hat auch nichts mit der Reihenfolge zu tun.

    Dim

  16. -Dann war ein Java Programmierer am Werk... :-)

    *wegrenn...*

    Naja die .Net'ler stehen uns Javafuzzis mittlerweile ja in nichts mehr nach :D

    Ergänzend zu flashpixxs Aussage, sind PK-FK Constraints in einer Multiuser Umgebung die einzig sichere Möglichkeit die Konsistenz der Daten sicherzustellen - es sei denn, man sperrt alle betroffenen Tabellen und lässt immer nur eine Änderung gleichzeitig zu- Diese Anwendung wird das Monatsende sicherlich nicht überleben...

    Beispiel:

    Session A löscht Satz 1 sowie den (fachlich) untergeordneten Satz 1.1.

    Session B prüft gleichzeitig, ob Satz 1 noch vorhanden ist, was erfolgreich ist, da Session A noch nicht committet hat und daher die Löschung noch nicht für andere Sichtbar ist.

    Session A comittet jetzt, während Session B den Satz 1.2 insertet im festen Glauben, dass der übergeordnete Satz 1 noch vorhanden ist.

    Damit sind die Daten inkonsistent und keiner weiß warum es meistens funktioniert und manchmal auch wieder nicht.

    Verwendet man RI, so kümmert sich die Datenbank darum, dass entsprechende Fehlermeldungen hochkommen sofern man das versucht.

    Allerdings nimmt einem RI nach wie vor nicht ab, optimistisches oder pessimistisches Locking in der Anwendung zu implementieren, da es ansonsten immer noch zu einem sog. Lost Update kommen kann. Die Daten sind dann zwar technisch konsistent der Anwender wundert sich aber, warum die Daten weg sind obwohl er fehlerfrei speichern konnte.

    Dim

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...