13. juli 2016 - 13:48Der 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?
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; //
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; //
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?
delimiter // ------------------------------------------------------------------- Jeg fjerner herefter delimiter // og //, men får så denne fejl: ------------------------------------------------------------------- Microsoft VBScript compilation error '800a03ea'
' 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); ' //
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 .......
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)
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 ........."
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 ... :)
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
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)
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
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?
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?
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?
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?
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.