Avatar billede steen_hansen Forsker
13. juli 2016 - 13:48 Der er 67 kommentarer og
2 løsninger

SQL skal rette status ved datoskift

Jeg har nogle brugere, som er opdelt i 2 kategorier: A eller B (det er defineret i RS("category"))

Alle brugerne i kategori A skal have rettet deres status til RS("status") = 4 hver dag ved datoskift, men kun hvis RS("status") = 1, 2 eller 3

Jeg fandt dette ved at google:

delimiter //
CREATE EVENT IF NOT EXISTS reset_user_currency
ON SCHEDULE EVERY 1 DAY STARTS '2014-06-22 00:00:00'
ON COMPLETION PRESERVE ENABLE
DO
    update users
    set currenty = 900;
//

Kan dette omskrives til mit behov, eller er der en anden og mere hensigtsmæssig måde?
Avatar billede arne_v Ekspert
13. juli 2016 - 14:00 #1
Hvilken database bruger du?

Den SQL syntax ligner MySQL!
Avatar billede softspot Forsker
13. juli 2016 - 14:01 #2
Måske noget i stil med dette:

delimiter //
CREATE EVENT IF NOT EXISTS reset_bruger_status
ON SCHEDULE EVERY 1 DAY STARTS '2014-06-22 00:00:00'
ON COMPLETION PRESERVE ENABLE
DO
    update bruger
    set status = 4
    where category = 'A'
    and status between 1 and 3;
//
Avatar billede softspot Forsker
13. juli 2016 - 14:18 #3
Hvis det er en SQL Server kan du nok få noget ud af dette: https://msdn.microsoft.com/en-us/library/ms187320.aspx

og for at oprette et job: https://msdn.microsoft.com/en-us/library/ms191439.aspx
Avatar billede steen_hansen Forsker
13. juli 2016 - 15:11 #4
Det er MySQL. Det ser fornuftigt ud, Arne. Jeg vil prøve det af.
Avatar billede steen_hansen Forsker
13. juli 2016 - 15:16 #5
Sorry, min beskrivelse er ikke helt korrekt:

men kun hvis RS("status") = 11, 14 eller 17

Så må det næsten være

delimiter //
CREATE EVENT IF NOT EXISTS reset_bruger_status
ON SCHEDULE EVERY 1 DAY STARTS '2014-06-22 00:00:00'
ON COMPLETION PRESERVE ENABLE
DO
    UPDATE user
    Set status = 8
    WHERE category = 'A'
    And status = 11 Or status = 14 Or status = 17;
//

Er det korrekt?
Avatar billede softspot Forsker
13. juli 2016 - 15:24 #6
Jeg ved ikke om du kan bruge IN på MySQL, men ellers er din egen syntax nok fin.

UPDATE user
    Set status = 8
    WHERE category = 'A'
    And status IN (11, 14, 17);
Avatar billede softspot Forsker
13. juli 2016 - 15:25 #7
Næh, ved nærmere eftersyn så skal du nok lige have parentes omkring dine status-betingelser, hvis du vil bruge or-syntaxen.

    UPDATE user
    Set status = 8
    WHERE category = 'A'
    And (status = 11 Or status = 14 Or status = 17);
Avatar billede arne_v Ekspert
13. juli 2016 - 15:47 #8
IN virker i MYSQL
Avatar billede arne_v Ekspert
13. juli 2016 - 15:48 #9
@Steen

SQL var fra softspot ikke fra mig
Avatar billede steen_hansen Forsker
13. juli 2016 - 16:13 #10
Jeg tror jeg prøver IN. Eller begge

Det er længe siden jeg har været herinde. Jeg kan se pointsystemet er fjernet. I stedet gradueres man som Nybegynder, Novice osv. Man kan ikke dele "anerkendelse", men kun sætte det på ét svar?
Avatar billede steen_hansen Forsker
13. juli 2016 - 16:13 #11
Eller kan jeg markere flere som "Markér som løsning"?
Avatar billede arne_v Ekspert
13. juli 2016 - 16:46 #12
Jeg mener godt at du kan markere flere som loesning.
Avatar billede steen_hansen Forsker
13. juli 2016 - 17:06 #13
Jeg fik en fejl, da jeg satte det ind:

Microsoft VBScript compilation error '800a03ea'

Syntax error

/default.asp, line 14

delimiter //
-------------------------------------------------------------------
Jeg fjerner herefter delimiter // og //, men får så denne fejl:
-------------------------------------------------------------------
Microsoft VBScript compilation error '800a03ea'

Syntax error

/default.asp, line 15

CREATE EVENT IF NOT EXISTS reset_bruger_status

Så denne SQL indeholder en syntaxfejl?
Avatar billede steen_hansen Forsker
13. juli 2016 - 17:11 #14
Set RS = Conn.Execute("SELECT * FROM users")

'    delimiter //
    CREATE EVENT IF NOT EXISTS reset_bruger_status
        ON SCHEDULE EVERY 1 DAY STARTS '2016-07-11 00:00:00'
        ON COMPLETION PRESERVE ENABLE
        DO
            UPDATE frokost
            Set status = 8
            WHERE category = 'A'
            And status IN (1, 2, 11);
'    //

    RS.Close
    Set RS = Nothing

%>
Avatar billede steen_hansen Forsker
13. juli 2016 - 17:19 #15
Avatar billede arne_v Ekspert
13. juli 2016 - 17:40 #16
Du skal ikke fyre den af fra ASP.

Du skal fyre den af ved SQL prompt.
Avatar billede arne_v Ekspert
13. juli 2016 - 17:41 #17
Det er en database admin ting ikke en web applikation ting.
Avatar billede arne_v Ekspert
13. juli 2016 - 17:41 #18
Har du PHPMyAdmin adgang?
Avatar billede steen_hansen Forsker
13. juli 2016 - 17:43 #19
Sorry :p Man opretter et job.

Du må lige forklare helt fra bunden hvis du har tid. Jeg skal virkelig tages i hånden. Kan det klares fra PHPMyAdmin?
Avatar billede steen_hansen Forsker
13. juli 2016 - 17:46 #20
"Tilføj triggers" på Fanebladet "Triggers/Udløsere"?
Avatar billede steen_hansen Forsker
13. juli 2016 - 17:47 #21
Ja, jeg har PHPMyAdmin adgang
Avatar billede arne_v Ekspert
13. juli 2016 - 18:27 #22
PHPMyAdmin har mulighed for at indtaste SQL saetning.

Brug det vindue til at udfoere den SQL.
Avatar billede steen_hansen Forsker
13. juli 2016 - 18:31 #23
Hvor finder jeg det SQL vindue? Der er en formular, man kan udføre, men jeg kan ikke se en SQL prompt.
Avatar billede arne_v Ekspert
13. juli 2016 - 18:33 #24
Jeg har en SQL tab hvor man kan indtaste SQL i textarea og klikke GO.
Avatar billede steen_hansen Forsker
13. juli 2016 - 18:44 #25
Jeg har VIS, STRUKTUR, SQL ........

Jeg kopierer det ind SQL?
Avatar billede steen_hansen Forsker
13. juli 2016 - 19:05 #26
Jeg prøvede, og det fejlede.

Jeg valgte tab "Triggers/Udløsere" og valgte "Tilføj trigger"

Triggernavn: reset_user_status
Tabel: users
Tid: Her kan jeg vælge BEFORE eller AFTER (Hvilken skal vælges?
Hændelse: Jeg vælger UPDATE
Definition: Her indsætter jeg SQL'en (kopierer det hele ind)
Opretter: Min e-mailadresse

Er der noget fra SQL'en, der skal udelades?

delimiter //
    CREATE EVENT IF NOT EXISTS reset_user_status
        ON SCHEDULE EVERY 1 DAY STARTS '2016-07-11 00:00:00'
        ON COMPLETION PRESERVE ENABLE
        DO
            UPDATE users
            Set status = 8
            WHERE category = 'a'
            And status IN (1, 2, 11);
//

Jeg har prøvet at fjerne den første og den sidste linie, udelade ON SCHEDULE linien. Den siger syntax error på ON SCHEDULE .......
Avatar billede softspot Forsker
13. juli 2016 - 21:43 #27
Du kunne nok godt "fyre den af" i din ASP-side (hvis ellers den bruger du anvender i din ASP-kode har rettigheder til at udføre disse administrative SQL-sætninger), men det skal lige omsættes til et format der udfører SQL-sætninger.

Du skal dog nok finde et sted i koden, som kun kan styres af administratorer, så scriptet ikke bliver udført mere end allerhøjst nødvendigt.

Det kunne se således ud:

sql = "CREATE EVENT IF NOT EXISTS reset_bruger_status " & _
        "ON SCHEDULE EVERY 1 DAY STARTS '2016-07-11 00:00:00' " & _
        "ON COMPLETION PRESERVE ENABLE " & _
        "DO " & _
        "    UPDATE frokost " & _
        "    Set status = 8 " & _
        "    WHERE category = 'A' " & _
        "    And status IN (1, 2, 11);"
Conn.Execute(sql)
Avatar billede arne_v Ekspert
13. juli 2016 - 22:19 #28
Det er ikke en trigger. Den skal ind som ren SQL.
Avatar billede steen_hansen Forsker
13. juli 2016 - 22:54 #29
Den vil jeg prøve. Det værste, der kan ske, er at at det fejler :)
Avatar billede steen_hansen Forsker
14. juli 2016 - 00:46 #30
Der skete desværre ingenting overhovedet.

Det må da kunne lade sig gøre at køre det som trigger i PHPMyAdmin?
Avatar billede arne_v Ekspert
14. juli 2016 - 01:39 #31
Hvis du ikke fik en fejl meddelse saa tyder det da paa at den er gaaet godt.
Avatar billede arne_v Ekspert
14. juli 2016 - 01:40 #32
Proev og lav en:

SHOW EVENTS
Avatar billede steen_hansen Forsker
14. juli 2016 - 18:32 #33
Arne, der skete desværre ingenting overhovedet. Så ja, det gik godt, hvis man regner med ingen handling, ingen fejl :)

SHOW EVENTS?
Avatar billede arne_v Ekspert
14. juli 2016 - 18:43 #34
SHOW EVENTS

in PHPMyAdmin in SQL tab
Avatar billede steen_hansen Forsker
14. juli 2016 - 21:57 #35
Jeg tror ikke vi har den samme version af PHPMyAdmin, Arne. Der er ingen SHOW EVENTS på SQL tab

Kender du til triggers, som jeg skrev om i #26?
Avatar billede arne_v Ekspert
14. juli 2016 - 22:13 #36
SHOW EVENTS skal skrives ind som SQL saetning og udfoeres.
Avatar billede arne_v Ekspert
14. juli 2016 - 22:14 #37
Jeg kender godt triggers, men de koeres naar noget bliver lavet paa databasen - ikke en gang i doegnet.
Avatar billede steen_hansen Forsker
14. juli 2016 - 22:15 #38
Har du andre idéer til hvordan man ændre status ved hvert datoskift?
Avatar billede arne_v Ekspert
16. juli 2016 - 05:02 #39
En event maa vaere den rigtige loesning.

Find SQL tab i PHPMyAdmin og se om SHOW EVENTS viser noget.
Avatar billede steen_hansen Forsker
16. juli 2016 - 19:35 #40
Det er dét, der er problemet. Jeg tror vi arbejder i forskellige versioner af PHPMyAdmin, der er ikke nogen SHOW EVENTS eller VIS HÆNDELSE på SQL tab.
Avatar billede arne_v Ekspert
16. juli 2016 - 20:07 #41
Du skal selv indtaste SHOW EVENTS i text area og klikke paa GO knappen.
Avatar billede steen_hansen Forsker
16. juli 2016 - 22:26 #42
Ok, så fik jeg noget: "Den nuværende markering indeholder ikke en unik kolonne. Redigering af gitter, afkrydsningsfelt, redigering og sletning er ikke tilgængelige."

I den nederste række står der "Db, Name, Definer, Timezone, Type, Execute at ........."

Skal du bruge nogle af de værdier?
Avatar billede arne_v Ekspert
17. juli 2016 - 05:03 #43
Ved SHOW EVENTS ????
Avatar billede steen_hansen Forsker
17. juli 2016 - 07:41 #44
Ja, det er ved SHOW EVENTS
Avatar billede steen_hansen Forsker
20. juli 2016 - 11:20 #45
I PHPMyAdmin har jeg databasen
På næste niveau har jeg "Hændelser" og "Tabeller"
Under "Hændelser" lå der dælme reset_user_status. Så den har taget det :)
Der skulle lidt tilretning til, og så så det korrekt ud:

DROP EVENT `reset_user_status`; CREATE DEFINER=`min_database_administrator`@`%` EVENT `reset_user_status` ON SCHEDULE EVERY 1 DAY STARTS '2016-07-19 00:00:00' ON COMPLETION PRESERVE ENABLE DO UPDATE users Set status = 8 WHERE category = '1, 2, 3' And status IN (1, 2, 11)

Jeg har udvidet category til alle: 1, 2 og 3

Det ser da ud til at være korrekt, gør det ikke?

Det er virkelig nemt, det er en formular med formularfelter. Man kan vælge.om det skal være kontinuerligt, eller bare én gang. Alt det bøvl ... :)

Tak for hjælpen, begge to :)
Avatar billede steen_hansen Forsker
20. juli 2016 - 11:32 #46
Hov, hvorfor står der står DROP EVENT? Den event skulle jo helst ikke fjernes.

Når jeg kigger i "Rediger hændelse":

Hændelsesnavn: reset_user_status
Status: Enabled
Hændelsestype: RECURRING
Udfør hver: 1 - DAY
Start: 2016-07-19 00:00:00
Slut: (Ingenting, blank, "")
UPDATE users    Set status = 8    WHERE category = '1, 2, 3'    And status IN (1, 2, 11)


Dvs category 1, 2 og 3 med  status 1, 2 og 11 vil få status sat til 8 hver dag, korrekt? Der er ikke noget, der forsvinder med den DROP?
Avatar billede michael_stim Ekspert
20. juli 2016 - 12:11 #47
Denne ser ikke rigtig ud:
WHERE category = '1, 2, 3'

Skal det ikke väre WHERE category IN(1, 2, 3)
Avatar billede michael_stim Ekspert
20. juli 2016 - 12:14 #48
Hvis der ikke stod DROP EVENT ville du få en fejl pga den pröver at oprette et event der allerede eksisterer.
Avatar billede steen_hansen Forsker
20. juli 2016 - 14:12 #49
Ok, tak for info, Michael

Der skal egentlig slet ikke kigges på category. Jeg skal udelukkende have ændret status til 1, hvor status er 1, 2 eller 11
Avatar billede steen_hansen Forsker
20. juli 2016 - 14:14 #50
UPDATE users    Set status = 8    WHERE status = 1 And status = 2 And status = 11

Det må næsten være på denne måde?
Avatar billede steen_hansen Forsker
20. juli 2016 - 14:15 #51
Jeg skal udelukkende have ændret status til 1 = Jeg skal udelukkende have ændret status til 8
Avatar billede michael_stim Ekspert
20. juli 2016 - 14:28 #52
WHERE status IN(1, 2, 8)
Avatar billede michael_stim Ekspert
20. juli 2016 - 14:29 #53
Hov, 11 i stedet for 8:

WHERE status IN(1, 2, 11)
Avatar billede steen_hansen Forsker
20. juli 2016 - 16:19 #54
Ok, Michael.

Jeg har testet det, og det virker ikke. Status bliver ikke rettet fra x til 8. Nogen idéer hvorfor ikke?
Avatar billede michael_stim Ekspert
20. juli 2016 - 16:37 #55
Man kan ikke bare skrive "Det virker ikke". Lidt mere köd på benene tak.

Hvad sker der (ikke)?
Hvordan ser dit EVENT ud nu?
Hvordan har du testet?
osv
Avatar billede steen_hansen Forsker
20. juli 2016 - 16:42 #56
Hændelsesnavn: reset_user_status
Status: Enabled
Hændelsestype: RECURRING
Udfør hver: 1 - DAY
Start: 2016-07-19 00:00:00
Slut: (Ingenting, blank, "")
UPDATE users    Set status = 8    WHERE status IN (1, 2, 11)

Retter jeg tiden til 16:50:00, sker der intet. Status, som står til 1, 2 eller 11, bliver ikke rettet til 8 klokken 16:50:00
Avatar billede steen_hansen Forsker
20. juli 2016 - 16:44 #57
DROP EVENT `reset_user_status`; CREATE DEFINER=`include_admin`@`%` EVENT `reset_user_status` ON SCHEDULE EVERY 1 DAY STARTS '2016-07-19 16:45:00' ON COMPLETION PRESERVE ENABLE DO UPDATE users Set status = 8 WHERE status IN(1, 5, 2 ,11)
Avatar billede michael_stim Ekspert
20. juli 2016 - 16:54 #58
Pröv at vente til i morgen og sen om den ikke bliver kört.
Avatar billede steen_hansen Forsker
20. juli 2016 - 16:57 #59
Det kan jeg selvfølgelig gøre. Men TT:MM:SS burde jo afgøre hvornår det bliver kørt, korrekt? Så i princippet kan det være lige meget, om der står 07:43:56 eller 00:00:00
Avatar billede steen_hansen Forsker
20. juli 2016 - 17:37 #60
Måske jeg mangler EVENT rettigheder på databasebrugeren? Og i givet fald, det er vel noget jeg skal få min host til at sætte? Eller er det en indstilling jeg aldrig selv har fået sat?
Avatar billede steen_hansen Forsker
20. juli 2016 - 17:39 #61
Nej, det ser ud til, at jeg har rettigheder til alt :o[
Avatar billede steen_hansen Forsker
20. juli 2016 - 17:56 #62
SELECT @@event_scheduler; viser, at event scheduler er sat til OFF

SET GLOBAL event_scheduler := 1; kan jeg ikke få lov til, da jeg tilsyneladende ikke har SUPER privilege(s):

Fejl

SQL-forespørgsel:

SET GLOBAL event_scheduler := 1

MySQL returnerede: Dokumentation
#1227 - Access denied; you need (at least one of) the SUPER privilege(s) for this operation

Jeg var inde for at se, om jeg har alle rettigheder på databasebrugeren, og det er der. Inklusive "Hændelser". Er der yderligere, der skal tilføjes? Jeg er ikke helt med på hvor man evt. sætter SUPER privilege(s) op. Eller er det noget min host skal sætte op?
Avatar billede steen_hansen Forsker
20. juli 2016 - 18:06 #63
GRANT SUPER ON *.* TO min_bruger@'localhost' IDENTIFIED BY '[mit_password]';

Fejl

SQL-forespørgsel:

GRANT SUPER ON *.* TO min_bruger@'localhost' IDENTIFIED BY '[mit_password]'

MySQL returnerede: Dokumentation
#1045 - Access denied for user 'min_bruger'@'%' (using password: YES)

Dvs jeg ikke selv har rettigheder, og skal sandsynligvis få min host til at sætte det op. Medmindre de siger, at det vil give mig adgang til hele serveren .......? Men det må da næsten være humlen i det her, det er fordi @@event_scheduler; er sat til OFF?
Avatar billede steen_hansen Forsker
20. juli 2016 - 19:54 #64
Jeg har snakket med min host. Man kan ikke udføre hændelser af hensyn til sikkerhed og stabilitet. Men ham jeg snakkede med, anbefalede cron-job.org. Her kan man sætte en scheduler op til at udføre et script på alverdens intervaller. Så jeg lavede dette:

cronupdatestatusjob.asp:

<%

    [Min connection string]

    SQL = "UPDATE users SET status = 8 WHERE status = IN(1, 2, 5, 11)"

    Conn.Close
    Set Conn = Nothing

%>

Umiddelbart ville jeg mene, at det var nok. Men det ser ikke ud til at UPDATE virker. Har I nogen idéer til hvordan man kan få scriptet aktiveret?
Avatar billede steen_hansen Forsker
20. juli 2016 - 20:06 #65
Jeg glemte at hive status ud. Men det ser stadig ikke ud til at virke.

    Set RS = Conn.Execute("SELECT status FROM users")

    SQL = "UPDATE users SET status = 8 WHERE status = IN(1, 2, 5, 11)"

    RS.Close
    Set RS = Nothing

    Conn.Close
    Set Conn = Nothing
Avatar billede steen_hansen Forsker
20. juli 2016 - 21:18 #66
Det virker måske kun med, method="post"? Håber I kan hjælpe.
Avatar billede michael_stim Ekspert
20. juli 2016 - 21:47 #67
Cronjob er kun på apache, så skal du have fat i nogen der tilbyder den tjeneste som.:
https://www.cron-job.org/en/
Avatar billede steen_hansen Forsker
20. juli 2016 - 22:49 #68
Det er jo også den jeg benytter :)

Som jeg har forstået det, skal jeg bare have aktiveret en side på min server fra cron-job.org, som aktiverer scriptet på min server.
Avatar billede steen_hansen Forsker
21. juli 2016 - 01:23 #69
Der var et par åbenlyse fejl :p Det virker fint: http://www.computerworld.dk/eksperten/spm/1011833?k=8226294
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester