Datenbank up to date halten

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Datenbank up to date halten

    Hallo ihr lieben, habe ne kleine frage...
    es geht um "projekte" die nach ablaufzeit automatsch auf den freigabestatus false gesetzt werden.

    habe in der db auch schon die erstellungzeiten nebst ablaufdatum für die einzelnen projekte.
    jetzt würde es mich interessieren wie ich es schaffe, dass die datenbank automatisch den wert des freigabestatus bei erreichen des datum auf false setzt, ohne das ein admin on kommen muss um die projekte halt up to date zu halten.

    von wegen select ablaufdatum from projekte where freigabe = true;

    if(aktuelles datum > als ablaufdatum )
    {
    setze freigabe von projekt auf false;
    }
    so würde ich es machen wenn der admin die db immer clean halten sollte...

    Ich möchte es aber das dass system es automatisch macht...

    WIE GEHT DAS BITTESCHÖN ???????

  • #2
    Du kannst es über einen Cronjob lösen (Vollautomatisch) oder du legst es auf eine Seite, die von Leuten besucht wird und lässt gleichzeitig ein Update über die Datenbank laufen (könnte auf die Performance gehen).

    Cronjobanbieter gibt es viele. Einfach die große Suchmaschine befragen.

    Wenn du es mit PHP lösen willst, dann musst die Daten aus der Datenbank lesen, durch Kontrolle laufen lassen und mittels update korrigieren.
    Einfacher und weniger Performancefressend wäre ein Trigger auf der Datenbank selbst, der wenn ein Tabellenzugriff passiert den Trigger ausführen lässt welcher die Kontrolle durchführt und wenn notwendig den Eintrag bearbeitet.

    Kommentar


    • #3
      Zitat von Nils81 Beitrag anzeigen
      habe in der db auch schon die erstellungzeiten nebst ablaufdatum für die einzelnen projekte.
      jetzt würde es mich interessieren wie ich es schaffe, dass die datenbank automatisch den wert des freigabestatus bei erreichen des datum auf false setzt, ohne das ein admin on kommen muss um die projekte halt up to date zu halten.
      Wozu? Du hast doch die Ablaufzeit. Das sollte ausreichen.

      Kommentar


      • #4
        Danke schonmal für den tip mit dem triggern, habe das aber versucht mit events und prozeduren zu lösen...
        nur bekomme ich das irgendwie nicht so richtig hin.

        habe die prozedur erstellt und mit dem event verknüpft
        hier die prozedur:
        das event wird jeden tag ausgeführt.
        jetzt habe ich das problem, dass wenn ich die prozedur manuel ausführe andert er nicht die daten also die freigabe der betroffenen tupel wird nicht auf 0 gesetzt obwohl das ablaufdatum kleiner als das aktuelle datum ist
        Code:
        begin
        declare uid int;
        select ablaufdatum from projekt;
        if (ablaufdatum < now())
        then
        update projekt set freigabe = 0;
        end if;
        select user_user_id into uid from projekt where freigabe=0;
        update user set projektanzahl = projektanzahl-1 where user_id=uid;
        end

        Kommentar


        • #5
          So... nach vielen rumversuchen, habe ich dann doch eine lösung gefunden, die dann gerne hier posten möchte:
          (glaube so wird es gerne gesehen, wenn ich mich nicht verlesen habe).


          durch die automatisierung erreiche ich das die projekte die ihre deadline erreicht haben in eine andere tabelle(für abgelaufene und gelöschte projekte) geschrieben werden, dannach wird beim user der erstellten projekte die anzahl von maximal 10 erstellten projekte um -1 reduziert(je nachdem wieviele projekte an demselben tag abgelaufen sind)
          dannach werden das/die projekt(e) aus der tabelle für laufende projekte entfernt.

          hier der code für die prozedur:
          Code:
          begin
          update projekt set freigabe = 0 where current_date() > ablaufdatum;
          update user set projektanzahl=projektanzahl-1 where user_id= any (select user_user_id from projekt where current_date() > ablaufdatum);
          insert into abgelaufene_projekte(projekt_id,titel,kurzbeschreibung,beschreibung,kategorie,ablauf_datum,user_id)
          select projekt_id,titel,kurzbeschreibung,beschreibung,kategorie,ablaufdatum,user_user_id from projekt where freigabe = 0;
          delete from projekt where freigabe = 0;
          end

          Kommentar


          • #6
            Wozu gibst du die abgelaufenen Projekte in eine extra Tabelle? Ist doch unnötig. Du machst dir so viel Aufwand für etwas, das dir nichts bringt.

            Kommentar


            • #7
              Ich kenne den weiteren Hintergrund nicht und vielleicht hat es irgendwo einen Sinn, aber ohne dieses wissen denke wie die anderen.
              Das ist total aufwendig.

              Wenn du einfach auf die Ablaufzeit im Skript so selektierst, sodass diese nicht mehr angezeigt werden hast du immer eine aktuelle Ausgabe ohne das du etwas bearbeiten müsstest und du würdest für immer wissen wann das Projekt abgelaufen ist.
              Wenn du dann wirklich ganz sicher sein willst, mach ich mir hin und wieder zur Unterstützung einen Flag mit einer Zahl.

              Hier hab ich dann zum Beispiel so ein Schema... 0=deaktiviert 1=Bearbeitung 2=veröffentlicht 3=privat 4=abgelaufen 9=gelöscht

              Ich bin ursprünglich davon ausgegangen das du Sicherungen machen möchtest bzw. diese entfernen möchtest oder der gleichen.

              Kommentar


              • #8
                Ich schreibe die projekte in eine extra tabelle, da der chef möchte, dass sie noch 1 jahr nach ablauf gespeichert werden.
                wenn ich sie denn in der gleichen tabelle lasse wie die aktiven, habe ich das problem dass die projektanzahl der user jeden tag nach der prozedur um -1 oder mehr reduziert werden, weil (wenn projekt current_date() > ablaufdatum) update user projektanzahl -1. und wenn nun noch mehrere abgelaufene projekte in der tabelle stehen reduziert der jeden tag um -1, bzw. -n und das soll nicht geschehen.
                nach nochmaligen überdenken, hätte ich die projekte drin stehen lassen können, wenn ich das ablaufdatum gelöscht hätte aber weil ich die prozedur noch ein wenig erweitert habe um eine funktion die die abgelaufenen projekte nach 12 monaten atomatisch löscht, brauchte ich das ablaufdatum.
                Zuletzt geändert von Nils81; 22.05.2014, 08:50.

                Kommentar


                • #9
                  Zitat von Nils81 Beitrag anzeigen
                  Ich schreibe die projekte in eine extra tabelle, da der chef möchte, dass sie noch 1 jahr nach ablauf gespeichert werden.
                  wenn ich sie denn in der gleichen tabelle lasse wie die aktiven, habe ich das problem dass die projektanzahl der user jeden tag nach der prozedur um -1 oder mehr reduziert werden, weil (wenn projekt current_date() > ablaufdatum) update user projektanzahl -1. und wenn nun noch mehrere abgelaufene projekte in der tabelle stehen reduziert der jeden tag um -1, bzw. -n und das soll nicht geschehen.
                  Du hast redundante Daten in deiner Datenbank. Deine ganzen Updates kannst du dir sparen. Die Daten lassen sich alle on-demand ermitteln. Du machst dir 10mal so viel Aufwand, wie sein müsste.

                  Zitat von Nils81 Beitrag anzeigen
                  nach nochmaligen überdenken, hätte ich die projekte drin stehen lassen können, wenn ich das ablaufdatum gelöscht hätte aber weil ich die prozedur noch ein wenig erweitert habe um eine funktion die die abgelaufenen projekte nach 12 monaten atomatisch löscht, brauchte ich das ablaufdatum.
                  Wozu das Ablaufdatum löschen? Wenn das Projekt abgelaufen ist, hat es ein Ablaufdatum. Punkt, aus. Wozu doktorst du da herum?

                  Kommentar


                  • #10
                    Du machst dir das Leben an der falschen Ecke schwer.
                    Das muss doch leichter gehen. Vergiss mal dein -1 Update. Ich versteh nicht warum das benötigst?

                    Beispiel vereinfacht dargestellt...

                    Code:
                    DB
                    Projekte
                    ID | User | Projekt | Ablaufdatum timestamp/Datum
                    1  | Name | Blabla1 | gestern
                    1  | Name | Blabla2 | heute vor 30 Minuten
                    1  | Name | Blabla3 | morgen um 12
                    1  | Name | Blabla4 | in einer Woche um 21:00
                    usw....
                    Welche nicht abgelaufenen Projekte hat der User?
                    Code:
                    Select * FROM Projekte 
                    WHERE 
                      user = Name 
                    AND
                      Ablaufdatum >= 'als jetzt timestamp/Datum'
                    Ablaufdatum < 'als jetzt timestamp/Datum' wäre dann genau anders rum. Was ist abgelaufen?

                    Darf der User noch ein Projekt anlegen?
                    Code:
                    Select count(id) from Projekte
                    WHERE
                      user = Name
                    AND
                      Ablaufdatum >= als jetzt
                    PHP-Code:
                    $count Ergebnis;
                    IF(
                    $COUNT 10) {
                     
                    $erlaubnis false; -- zB Anlageformular laden...
                    }else{
                     
                    $erlaubnis true; -- zB Sorrydarst nicht mehr...

                    Mehr würdest du nicht benötigen und müsstest so nie was löschen und/oder verschieben usw.
                    Zudem sparst du Zeit und Resourcen.

                    Und wie gesagt wennst ganz sicher sein willst. aktiv = 1 oder 0
                    zB
                    Code:
                    WHERE .... AND aktiv = 1

                    Kommentar

                    Lädt...
                    X