Noen verktøy levert av MySQL -databasemotoren er lagrede prosedyrer, funksjoner og utløser, som brukes til å utføre transaksjoner eller operasjoner som å sette inn eller endre poster.
Lagrede prosedyrer er små programmer utviklet i SQL -kode. En lagret prosedyre er et sett med SQL -kommandoer som lagres sammen med databasen.
Fordelen med en lagret prosedyre er at vi kan opprette den i en hvilken som helst tekstredigerer, og til og med på serveren, den blir utført av databasemotoren, og den er ikke tilgjengelig for brukere, men bare for administratoren.
En lagret prosedyre sender resultatene til en applikasjon slik at den viser dem på skjermen og unngår overbelastning av serveren i opplæringen:
- MYSQL lagrede prosedyrer - oppretting, forespørsler og datainnlegg
Jeg hadde forklart hvordan jeg lager dem, her vil vi legge til funksjoner og utløsere. Vi vil se et eksempel på en database over en eiendom som vi vil kalle leieplass, og deretter vil vi lage tabellene.
- Tabellstruktur for tabellen `fast eiendom` SKAP TABELL HVIS IKKE FESTER` eiendom` (` id` int (11) NOT NULL, `userid` int (11) DEFAULT NULL,` idtype property` int (6) DEFAULT '0 ',' pris 'desimal (10,2) DEFAULT' 0.00 ',' kommisjon 'desimal (10,0) IKKE NULL,' beskrivelse 'tekst,' høydato 'dato DEFAULT' 0000-00-00 ',' provins-id ' int (10) DEFAULT NULL, `idlocalidad` int (10) DEFAULT NULL,` address` varchar (150) DEFAULT NULL, `floor and apartment` varchar (100) DEFAULT NULL,` between_streets` text, `idoperation` int (100 ) DEFAULT NULL, `featured` char (3) DEFAULT 'no', 'image1' varchar (255) DEFAULT NULL, 'image2' varchar (255) DEFAULT NULL, 'image3' varchar (255) DEFAULT NULL, 'image4' varchar (255) DEFAULT NULL, `old` varchar (100) DEFAULT NULL,` mt2covered` int (11) DEFAULT NULL, `lot_surface` int (11) DEFAULT NULL,` active` enum ('yes', 'no') NOT NULL DEFAULT 'si') ENGINE = MyISAM AUTO_INCREMENT = 196 DEFAULT CHARSET = latin1; - Indekser i tabellen `fast eiendom` ALTER TABLE` fast eiendom` TILFØR PRIMÆRNØKKEL (` id`);
Vi vil nå utvikle en lagret prosedyre for hver transaksjon for å spørre, sette inn, endre og slette en post.
Vi kan bruke Phpmyadmin eller en leder som Heidisql som er gratis og fungerer på Windows eller Linux med Wine.
Vi oppretter en lagret prosedyre for å spørre eiendomsbordet:
DELIMITER // OPPRETTE PROSEDYRE pa_listainmuebles () BEGIN VELG * FRA egenskaper; SLUTT // DELIMITER;MYSQL forstår at en setning ender med et semikolon. De DELIMITER uttalelse endre slutttegnet til et annet tegn, med konvensjon // brukes til å indikere slutten på den lagrede prosedyren slik at MySQL ikke avslutter den lagrede prosedyren når det første semikolonet støter på.
Vi kan gå til Fanen Rutiner for å se hver transaksjon vi har opprettet, og derfra kan vi endre, utføre, eksportere eller slette koden.
For å utføre en prosedyre ved å lagre bruker vi RING -kommando fra Kategorien SQL eller også fra et programmeringsspråk som .NET eller Java. Deretter påkaller vi den lagrede prosedyren som er opprettet med kommandoen.
RING pa_listainmuebles ();
Deretter vil vi lage en lagret prosedyre for å sette inn en egenskap, for dette trenger vi IN -type parametere, det vil si at vi vil tildele data og inndatavariabler til den lagrede prosedyren for å gjøre en transaksjon, i dette tilfellet lagre dem i databasen.
DELIMITER // CREATE PROCEDURE pa_nuevoinmueble (IN id INT, IN userid INT, IN price DECIMAL, IN provision DECIMAL) BEGIN INSERT INTO property` (`id`,` userid`, `price`,` provision`) VERDIER (id, userid ), pris, provisjon) SLUTT // DELIMITER;
FORSTØRRE
Deretter kan vi utføre den lagrede prosedyren ved å påkalle og tilordne parametrene.
RING `pa_newinmueble` ('12 ',' 15 ',' 10.00 ',' 0.05 ')Vi kan også legge inn data ved å kjøre rutinen fra Phpmyadmin.
FORSTØRRE
Deretter lager vi den lagrede prosedyren for å redigere en eiendom fra Phpmyadmin -redaktøren, i dette tilfellet vil vi bare endre prisen.
Vi kan opprette roller fra Definer -feltet der vi kan tildele en bruker som er definert i Mysql -serveren, i dette tilfellet rotbrukeren til localhost -verten, slik at den kan få tilgang til den lagrede prosedyren.
Hvis vi vil gjøre det fra SQL -kode, må vi utføre følgende kommandoer:
CREATE DEFINER = `root` @` localhost` PROCEDURE `pa_editarinmueble` (IN` new property` DECIMAL (10,2), IN` property id` INT (11)) BEGIN UPDATE property SET price = new property WHERE id = property id; SLUTTDu kjører den og du er ferdig.
Bruke Trigger eller Triggers i Mysql
En utløser eller utløser i MySQL er et sett med SQL -setninger som er avhengige av en lagret prosedyre og brukes til å kjøre automatisk når en bestemt hendelse oppstår i databasen vår. Disse hendelsene utløses av transaksjoner eller utsagn som INSERT, UPDATE og DELETE.
Et eksempel er når en endring lagres i et register, tar vi automatisk en sikkerhetskopi eller registrerer en revisjonsfil for å vite hvilke data som ble endret, når og hvem som endret dem. De kan brukes til enhver manipulasjon som påvirker dataene, for å støtte eller generere ny informasjon.
Vi vil lage eiendomsrevisjonstabellen nedenfor:
OPPRETT TABELL `revisjon` (` bruker` VARCHAR (200) NULL DEFAULT NULL, `beskrivelse` TEKST NULL,` dato` DATETIME NULL DEFAULT NULL) COLLATE = 'latin1_swedish_ci' ENGINE = InnoDBVi vil lage en utløser som lagrer en melding i revisjon hvis noen endrer prisen på en eiendom.
CREATE DEFINER = `root` @` localhost` TRIGGER `real estate_after_update` ETTER UPDATE ON` fast eiendom` FOR HVER RADESETT INN i revisjon (bruker, beskrivelse, dato) VERDIER (bruker (), CONCAT ('Eiendomspris endret', NEW.id, '(', OLD.price, ') av (', NEW.price, ')'), NÅ ())Denne utløseren utføres automatisk etter at en prisoppdatering skjer, vi kan inkludere flere felt hvis vi ønsker det, med GAMLE angir vi feltet med verdien før endringen og med NY angir vi den nye verdien som er angitt, med NÅ () spesifiserer vi datoen og nåværende tid.
Vi oppretter en utløser som vil ha Etter oppdatering på eiendommer som en hendelse, det vil si etter at en oppdatering skjer i tabellen for egenskaper, i så fall vil vi legge til brukeren som gjorde endringen, den nye prisen og den forrige prisen.
Jeg utfører en oppdatering på en eiendom:
RING `pa_editarinmueble` ('80000', '170')Så går vi til revisjonstabellen og vi kan se endringen:
Vi kan også se resultatene i en rapport i utskrift fra Phpmyadmin. Vi kan se hvordan dataene som identifiserer eiendommen, endringen som ble gjort og brukeren som gjorde den har blitt lagret, vi har også dato og klokkeslett for endringen.
Deretter vil vi se en annen mulig søknad hvis en eiendom leies, og som automatisk endrer statusen til ikke aktiv, eller vi gjør den utilgjengelig.
For dette må vi ha et enkelt bord hvor vi skal lagre hvilken eiendom som leies, for et praktisk eksempel vil vi ikke ta mye stringens i dataene.
LAG TABELL `utleie` (` id` INT (10) IKKE NULL, `eiendoms -id` INT (10) IKKE NULL,` leietaker -id` INT (11) IKKE NULL, PRIMÆR NØKKEL (`id`)) COLLATE = 'latin1_swedish_ci 'MOTOR = InnoDB;Deretter oppretter vi den lagrede prosedyren for å sette inn en ny post i tabellen for utleie.
CREATE DEFINER = `root` @` localhost` PROCEDURE `pa_newrental` (IN` property id` INT, IN` tenant id` INT) SPRÅK SQL IKKE DETERMINISTISK INNEHOLDER SQL SQL SECURITY DEFINER COMMENT 'INSERT INTO` Rentals' (`property id ' `,` leietaker -ID`) VERDIER (leietaker -ID, leietaker -ID)
Og så utløseren for å endre egenskaper aktivert:
CREATE DEFINER = `root` @` localhost` TRIGGER `Rentals_after_insert` EFTER INSERT ON` Rentals` FOR HVER RADEOPDATERING fast eiendom SET aktivert =` no 'hvor id = NYTT. EiendomsmeglerDeretter påkaller vi den lagrede prosedyren der vi tildeler eiendommens ID og klienten eller leietaker som jeg leier.
RING for ny utleie (170.11)Deretter går vi til eiendomstabellen, og vi bør se at det aktiverte feltet endrer tilstand hvis det er aktivt til IKKE det er aktivt.
Vi har sett fordelene ved å bruke trigger med lagrede prosedyrer i MySQL for:
- Revider og registrer endringer av hendelser eller aktiviteter i en tabell.
- Endre tilstanden til et felt ved å aktivere eller nekte tillatelser og handlinger på et bord
- Det tillater også å bevare konsistensen av dataene ved å utføre handlinger i henhold til hendelser som påvirker en eller flere tabeller.