Košarica (0)
  • Vaša košarica je trenutno prazna

NEOSERV BLOG

Novice in nasveti iz sveta domen, gostovanja, SSL certifikatov, spletnih strani, spletnih trgovin in ostalih področij spleta.

MySQL je priljubljen odprtokodni sistem za upravljanje s podatkovnimi bazami. Vključuje velik nabor funkcij, razvit v tesnem sodelovanju z uporabniki, ki rešitev uporabljajo že od leta 1995. MySQL poganja mnoge popularne spletne aplikacije, kot so Facebook, Netflix, Uber, Airbnb, Shopify in Booking.com. Tudi WordPress in številne druge platforme za upravljanje s spletnimi stranmi uporabljajo podatkovno bazo MySQL.

Pri uporabi podatkovne baze MySQL se naprednejši uporabniki srečujejo z različnimi izzivi. V nadaljevanju boste spoznali rešitev za težavo, do katere lahko pride pri uvozu baze podatkov, ki vsebuje tudi SQL rutine (ang. SQL Routines) – shranjene procedure, funkcije ali sprožilce.

Težava: Access denied; you need (at least one of) the SUPER privilege(s) for this operation

Kazalo

Kaj je MySQL rutina?

MySQL rutina je shranjen niz SQL stavkov, ki jih uporabnik lahko izvede s klicem imena rutine. Rutine so shranjene v podatkovni bazi in se uporabljajo za izvajanje določenih nalog in operacij, kar poenostavi delo z manipulacijo podatkov.

Prednosti uporabe MySQL rutin so večja varnost, zmanjšanje ponovnega pisanja kode in s tem povečanje učinkovitosti, saj uporabniku ni treba vedno znova izvajati posameznih SQL stavkov, ampak se lahko sklicuje na shranjeno rutino.

Poznamo tri vrste MySQL rutin:

  • Shranjene procedure (ang. Stored Procedures): To so skupine SQL stavkov, ki jih izvedemo s klicem imena procedure. Običajno sprejemajo parametre in vrnejo rezultat.
  • Shranjene funkcije (ang. Stored Functions): So vrsta rutin, ki sprejmejo vhodne parametre, izvedejo določeno logiko in nato vrnejo vrednost.
  • Sprožilci (ang. Triggers): Gre za vrsto rutine, ki se samodejno sproži ob določenih dogodkih, na primer ob vstavljanju, posodabljanju ali brisanju podatkov v tabeli.

Težava z uvozom MySQL rutin

Ko uporabnik nima “root” dostopa do strežnika in želi uvoziti MySQL podatkovno bazo, ki vključuje shranjene rutine, lahko pride do težave, zaradi katere uvoz baze ni uspešno zaključen.

Med postopkom uvoza pride do naslednjega opozorila:

Access denied; you need (at least one of) the SUPER privilege(s) for this operation

Preden opišemo rešitev, ki bo omogočila uvoz podatkovne baze s shranjenimi rutinami, moramo razjasniti še vlogo upravljalca MySQL rutin oziroma vrednost DEFINER.

DEFINER – lastnik shranjene rutine

DEFINER predstavlja uporabnika ali račun, ki je lastnik shranjene rutine. Ob kreiranju rutine torej lahko določimo, kateri uporabnik bo zanjo določen kot DEFINER. Ko rutina izvaja SQL stavke, se to izvaja s pravicami definiranega uporabnika, kar lahko vpliva na dostop do podatkov in izvedbo določenih operacij.

Uporaba vrednosti DEFINER je pomembna predvsem z dveh vidikov:

  • Privilegiji: Če shranjena rutina uporablja privilegije, ki jih ima definirani uporabnik, se bo izvajala z njegovimi pravicami. To lahko vpliva na dostop do tabel, pogledov, funkcij ali drugih virov podatkov v podatkovni bazi.
  • Varovanje virov: Uporaba vrednosti DEFINER omogoča boljši nadzor nad tem, kdo lahko izvaja določeno shranjeno rutino in s katerimi privilegiji. Z definiranjem uporabnika torej lahko zavarujemo posamezne vire podatkov.

Primer uporabe DEFINER-ja pri ustvarjanju shranjene procedure v MySQL:

DELIMITER //
CREATE PROCEDURE ImeProcedure(IN param1 INT)
    SQL SECURITY DEFINER
BEGIN
    SELECT * FROM tabela WHERE stolpec = param1;
END //
DELIMITER ;

V zgornjem primeru smo uporabili SQL SECURITY DEFINER, kar pomeni, da bo shranjena procedura izvajala SQL izjave s pravicami definiranega uporabnika. S tem smo pripomogli k večji varnosti in boljšemu nadzoru nad izvajanjem shranjenih rutin.

Zakaj pri uvozu MySQL lahko pride do težave?

Vrednost DEFINER določa MySQL uporabnika, ki bo uporabljen pri preverjanju privilegijev dostopa v času izvajanja rutine – za rutine z značilnostjo SQL SECURITY DEFINER.

Ime tega uporabnika lahko preverimo z BASH ukazom:

grep DEFINER export.sql

Ko začnemo novo sejo v nadzorni plošči cPanel, se ime začasnega MySQL uporabnika, ki ga uporabljamo za prijavo v phpMyAdmin, samodejno spremeni. Če je vrednost username drugačna od cPanel uporabniškega imena, bo to povzročilo težavo pri uvozu SQL izpisa.

Primer SQL izpisa:

/*!50003 CREATE*/ /*!50017 DEFINER=`cpses_dbhmxbj8s2`@`localhost`*/ /*!50003 TRIGGER `...` AFTER INSERT ON `...` FOR EACH ROW BEGIN

Vsa uporabniška imena cPanel so strukturirana v obliki cpses_db...@localhost, kjer pike nadomeščajo naključni znaki (v zgornjem primeru hmxbj8s2), zato se je v nadzorno ploščo cPanel treba prijaviti z uporabniškim imenom in geslom za ta cPanel račun.

Do enake težave lahko pride tudi v primeru, ko se MySQL baza prenaša med računi ali različnimi platformami.

Rešitev za uspešen uvoz podatkovne baze

Preden se lotite urejanja sprememb v izpisu podatkovne baze, vam svetujemo, da kreirate varnostno kopijo .sql datoteke.

Navajamo dve možnosti, kako odpraviti težavo z uvozom podatkovne baze, ki vključuje shranjene rutine.

1. možnost: Vrednost DEFINER= ... iz MySQL izpisa odstranimo, kar dosežemo z naslednjim BASH ukazom:

sed 's/\sDEFINER=`[^`]*`@`[^`]*`//g' -i export.sql

2. možnost: Vrednost DEFINER= ... v MySQL izpisu spremenimo oz. popravimo ime uporabnika (za zgoraj prikazan primer: cpses_dbhmxbj8s2), za kar uporabimo spodnji BASH ukaz:

sed 's/cpses_dbhmxbj8s2/ime_cPanel_uporabnika/g' -i export.sql

Ime uporabnika je v našem primeru cpses_dbhmxbj8s2. Zgornji ukaz ustrezno prilagodite – z ukazom grep DEFINER export.sql preverite ime dejanskega uporabnika in ga uporabite v BASH izrazu. Nadomestite tudi izraz ime_cPanel_uporabnika, in sicer s svojim dejanskim imenom cPanel računa, ki ga v nadzorni plošči cPanel najdete v desni sekciji: General Information -> Current User.

Zdaj lahko ponovno izvedemo uvoz SQL izpisa – podatkovna baza bo uspešno uvožena.

KOMENTARJI

KOMENTIRAJTE OBJAVO

(obvezno)
(obvezno, e-poštni naslov bo skrit)
(neobvezno)
Varnostno vprašanje, ki potrdi, da ste resnična oseba.