Lagret procedure

Den aktuelle version af siden er endnu ikke blevet gennemgået af erfarne bidragydere og kan afvige væsentligt fra den version , der blev gennemgået den 27. maj 2020; checks kræver 5 redigeringer .

En  lagret procedure er  et databaseobjekt , som er et sæt SQL-sætninger , der kompileres én gang og gemmes på serveren. Lagrede procedurer ligner meget almindelige procedurer i sprog på højt niveau , de kan have input- og outputparametre og lokale variabler , de kan udføre numeriske beregninger og operationer på tegndata, hvis resultater kan tildeles variabler og parametre. Lagrede procedurer kan udføre standard databaseoperationer (både DDL og DML ). Derudover er sløjfer og forgreninger mulige i lagrede procedurer, det vil sige, de kan bruge instruktioner til at styre udførelsesprocessen.

Lagrede procedurer ligner brugerdefinerede funktioner (UDF'er). Den største forskel er, at brugerdefinerede funktioner kan bruges som ethvert andet udtryk i en SQL-forespørgsel, mens lagrede procedurer skal kaldes ved hjælp af CALL-funktionen:

CALL procedure ( ... )

eller

UDFØR procedure ( ... )

Lagrede procedurer kan returnere resultatsæt, det vil sige resultaterne af en SELECT-forespørgsel. Sådanne resultatsæt kan behandles ved hjælp af markører, ved andre lagrede procedurer, der returnerer en resultatsætmarkør, eller af applikationer. Lagrede procedurer kan også indeholde deklarerede variabler til håndtering af data og markører, som giver dig mulighed for at sløjfe over flere rækker i en tabel. SQL-standarden giver IF, LOOP, REPEAT, CASE og mange flere udtryk at arbejde med. Lagrede procedurer kan acceptere variabler, returnere resultater eller ændre variable og returnere dem, afhængigt af hvor variablen er deklareret.

Implementeringen af ​​lagrede procedurer varierer fra et DBMS til et andet. De fleste større databaseleverandører understøtter dem i en eller anden form. Afhængigt af DBMS kan lagrede procedurer implementeres i forskellige programmeringssprog som SQL, Java, C eller C++. Lagrede procedurer, der ikke er skrevet i SQL, udfører muligvis selv SQL-forespørgsler. Den stigende brug af lagrede procedurer har ført til fremkomsten af ​​proceduremæssige elementer i SQL-sproget i SQL:1999- og SQL:2003-standarderne i SQL/PSM- delen . Dette gjorde SQL til et imperativt programmeringssprog . De fleste DBMS'er tilbyder deres egne proprietære og leverandørudvidelser oven i SQL/PSM.

Implementering af lagrede procedurer

Lagrede procedurer oprettes normalt ved hjælp af SQL-sproget og dets specifikke implementering i det valgte DBMS . Til disse formål har Microsoft SQL Server DBMS f.eks . Transact-SQL-sproget , Oracle  - PL/SQL , InterBase og Firebird  - PSQL , PostgreSQL  - PL/pgSQL , PL/Tcl , PL/Perl , PL/Python , IBM DB2  - SQL / PL , i Informix - SPL . MySQL følger SQL:2003 - standarden ganske tæt , og sproget ligner SQL/PL.

I nogle DBMS er det muligt at bruge lagrede procedurer skrevet i et hvilket som helst programmeringssprog, der er i stand til at skabe uafhængige eksekverbare filer, såsom C++ eller Delphi . I Microsoft SQL Server-terminologi kaldes sådanne procedurer udvidede lagrede procedurer og er simpelthen funktioner indeholdt i en Win32 DLL . Og for eksempel i Interbase og Firebird for funktioner kaldet fra DLL / SO, er et andet navn defineret - UDF (User Defined Function). MS SQL 2005 introducerede muligheden for at skrive lagrede procedurer i ethvert .NET -sprog , og udvidede lagrede procedurer er planlagt til at blive opgivet i fremtiden. Oracle DBMS tillader til gengæld at skrive lagrede procedurer i Java-sproget . [1] I IBM DB2 er skrivning af lagrede procedurer og funktioner i konventionelle programmeringssprog den traditionelle måde, understøttet fra starten, og SQL-procedureudvidelsen blev først tilføjet til denne DBMS ret sent, efter at den blev inkluderet i ANSI-standarden . Informix understøtter også Java- og C - procedurer . [2]

I Oracle DBMS kan lagrede procedurer kombineres til såkaldte pakker .  Pakken består af to dele - specifikationen ( eng. package specification ), som specificerer definitionen af ​​den lagrede procedure, og kroppen ( eng. package body ), hvor dens implementering er placeret. Således giver Oracle dig mulighed for at adskille programkodens grænseflade fra dens implementering.   

I IBM DB2 kan lagrede procedurer kombineres til .

I PostgreSQL er det, udover lagrede procedurer, muligt at oprette funktioner, der returnerer void type .

Formål og fordele ved lagrede procedurer [3]

Lagrede procedurer forbedrer ydeevnen, forbedrer programmeringsmulighederne og understøtter datasikkerhedsfunktioner.

I stedet for at gemme en ofte brugt forespørgsel, kan klienter henvise til den passende lagrede procedure. Når en lagret procedure kaldes, behandles dens indhold straks af serveren.

Ud over selve udførelsen af ​​forespørgslen giver lagrede procedurer dig også mulighed for at udføre beregninger og manipulere data - ændre, slette, udføre DDL-sætninger (ikke i alle DBMS!) og kalde andre lagrede procedurer, udføre kompleks transaktionslogik. En enkelt sætning giver dig mulighed for at kalde et komplekst script, der er indeholdt i en lagret procedure, som undgår at sende hundredvis af kommandoer over netværket og især behovet for at overføre store mængder data fra klienten til serveren.

I de fleste DBMS'er kompileres den første gang, en lagret procedure køres (parses og en dataadgangsplan genereres). I fremtiden er behandlingen hurtigere. Oracle DBMS fortolker lagret procedurekode gemt i en dataordbog . Startende med Oracle 10g understøttes den såkaldte native kompilering (native compilation) af lagret procedurekode i C og derefter ind i målmaskinens maskinkode, hvorefter, når den lagrede procedure kaldes, er dens kompilerede objektkode direkte henrettet.

Programmeringsfunktioner

Den genererede lagrede procedure kan kaldes til enhver tid, hvilket giver modularitet og tilskynder til genbrug af kode . Sidstnævnte gør det nemmere at vedligeholde databasen, da den bliver isoleret fra ændrede forretningsregler. Du kan til enhver tid ændre en lagret procedure for at overholde de nye regler. Derefter vil alle applikationer, der bruger det, automatisk overholde de nye forretningsregler uden direkte ændringer.

For at forenkle testning, uafhængigheden af ​​applikationernes forretningslogik fra DBMS, er der en tilgang, hvor DBMS kun fungerer som et lager med et minimum antal lagrede procedurer eller en fuldstændig afvisning af dem. I dette tilfælde bruges tilknytningen af ​​forretningslogiksoftwareenheder til lageret. Se ORM (eng. Object-relational mapping, rus. Object-relational mapping)

Sikkerhed

Brugen af ​​lagrede procedurer giver dig mulighed for at begrænse eller helt udelukke direkte brugeradgang til databasetabeller, så brugerne kun har tilladelse til at udføre lagrede procedurer, der giver indirekte og strengt reguleret adgang til data. Derudover understøtter nogle DBMS tekstkryptering (ombrydning) af en lagret procedure.

Disse sikkerhedsfunktioner giver dig mulighed for at isolere databasestrukturen fra brugeren, hvilket sikrer databasens integritet og pålidelighed.

Handlinger såsom " SQL-injektion " er mindre sandsynlige, fordi velskrevne lagrede procedurer desuden validerer inputparametre, før forespørgslen sendes til DBMS.

Noter

  1. OracleJVM og Java Stored  Procedures . Oracle Inc.. - En sektion af Oracle-portalen dedikeret til Java-teknologier som en del af Oracle DBMS-serveren. Hentet 6. juni 2009. Arkiveret fra originalen 21. august 2011.
  2. J/Foundation Developer's  Guide . IBM. — Afsnit af Informix-dokumentationen om udvikling af lagrede procedurer på Java-sproget. Hentet 9. februar 2011. Arkiveret fra originalen 10. februar 2012.
  3. Design og implementering af Microsoft SQL Server-databaser. - M.-SPb.: Russisk udgave, Peter, 2005. - 512 s. — ISBN 5-7502-0089-2 , ISBN 5-469-00821-5 .

Links