Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem krytyczny z uprawnieniami
Forum PHP.pl > Forum > Bazy danych
toolmaniak
Witam! Jest to w zasadzie kontynuacja poprzedniego POST-u tego z tabalami tymczasowymi, ale pojawił się zupełnie nowy problem. Otóż wcześniej miałem dla każdego użytkownika zdefiniowane nstępujące uprawnienia:

  1. REVOKE ALL PRIVILEGES ON `database` . * FROM 'lukasz'@'%'; GRANT USAGE ON `database` . * TO 'lukaszl'@ '%';
  2. GRANT SELECT , INSERT , UPDATE , REFERENCES ON `database`.`klienci` TO 'lukasz'@'%';
  3. GRANT SELECT , INSERT , UPDATE , REFERENCES ON `database`.`kontakty` TO 'lukasz'@'%';
  4. GRANT SELECT , INSERT , UPDATE , DELETE, REFERENCES ON `database`.`notatki` TO 'lukasz'@'%';
  5. GRANT SELECT , INSERT , UPDATE , REFERENCES ON `database`.`urzedy` TO 'lukasz'@'%';
  6. GRANT SELECT , INSERT , UPDATE , REFERENCES ON `database`.`status` TO 'lukasz'@'%';


Istniała jeszcze tabelka notatki_prywatne i tylko niektórzy ze specjalnymi uprawnieniami mieli do nich dostep. Zaistniała jednak konieczność użycia tymczasowych tabelek co wygląda mniej więcej tak:

  1. DROP TABLE IF EXISTS tmp;
  2. CREATE TEMPORARY TABLE tmp
  3. (SELECT firma,ulica,miejscowosc,kod_pocztowy,max(n.DATA) AS DATA,k.id AS id FROM klienci k,notatki n WHERE miejscowosc LIKE '%kraków%' AND k.id=n.id_klienci GROUP BY id);
  4.  
  5. INSERT INTO tmp ( SELECT firma,ulica,miejscowosc,kod_pocztowy,NULL AS DATA,k.id AS id FROM klienci k WHERE miejscowosc LIKE '%kraków%');
  6. SELECT DISTINCT firma, ulica,miejscowosc,kod_pocztowy,DATA,id FROM tmp GROUP BY id ORDER BY firma DESC;
  7. DROP TABLE IF EXISTS tmp;


No i żeby powyższe działało musiałem zdefiniować następujące uprawniena globalne:

  1. GRANT
  2. SELECT
  3. INSERT ,
  4. DROP ,
  5. CREATE TEMPORARY TABLES ,
  6. LOCK TABLES ON `database` . * TO 'lukasz'@'%';



Jak nietrudno się domyślić rozwaliło mi to całkiem dotychczasowy system przywilejów. Co zrobić, zostaje tylko tworzenie własnej tabeli z uprawnieniami i pozostawienie tych globalnych czy jest jakiś inny sposób? Please help.... blink.gif
SongoQ
A nie lepiej zrezygnowac z tabeli tymczasowej i wtedy sprawa grantow odpada.
toolmaniak
Niestety nie mogę zrezygnować z tymczasowej tabeli chyba, że masz jakiś pomysł na to aby wyświetlał klienta który nie ma przypisanej notatki. Mniejsza z tym - obszedłem ten problem tak, że utworzyłem statyczną tabele o takiej samej nazwie z jedną dowolna kolumną (chodziło tylko aby nie wywaliło braku tabeli przy poleceniu GRANT)

  1. CREATE TABLE tmp (id int(11) NOT NULL, PRIMARY KEY (id), UNIQUE ID (id));


a potem dla wszystkich usżytkowników nastepujące kwerendy:

  1. REVOKE ALL PRIVILEGES ON `database` . * FROM 'lukasz'@'%'; GRANT CREATE TEMPORARY TABLES ON `database` . * TO 'lukasz'@'%';
  2.  
  3. GRANT SELECT ,
  4. INSERT ,
  5.  
  6. UPDATE ,
  7. DELETE ,
  8. CREATE ,
  9. DROP ,
  10. REFERENCES ,
  11. INDEX ,
  12. ALTER ON `database`.`tmp` TO 'lukasz'@'%';
  13.  
  14.  
  15.  
  16. GRANT USAGE ON `database` . * TO 'lukasz'@'%' WITH GRANT OPTION;
  17. GRANT SELECT , INSERT , UPDATE , REFERENCES ON `database`.`klienci` TO 'lukasz'@'%';
  18. GRANT SELECT , INSERT , UPDATE , REFERENCES ON `database`.`kontakty` TO 'lukasz'@'%';
  19. GRANT SELECT , INSERT , UPDATE , DELETE, REFERENCES ON `database`.`notatki` TO 'lukasz'@'%';


dalej już tylko zależnie od tego do czego dany user może mieć dostęp. i później
FLUSH PRIVILEGES;

i DZIAŁA!

A to wszystko dzieki temu, że MySQL jest tak głupi, że nie wie czy ma do czynienia z tabela tymczasową czy statyczną, choć w dokumentacji pisało jak byk że te dwa typy nawet o takich samych nazwach nie ma ją na siebie wpływu. http://dev.mysql.com/doc ...Nie wiem, chyba czas przejść na POSTGRESA?questionmark.gif?
SongoQ
Tak mam pomysl. Bo widze ze kombinujesz jak kon pod gorke. Zastosuj zlaczenie z wykluczeniem rekordow.

  1. SELECT firma,ulica,miejscowosc,kod_pocztowy,max(n.DATA) AS DATA,k.id AS id FROM klienci k LEFT JOIN notatki n ON (k.id=n.id_klienci) WHERE miejscowosc LIKE '%kraków%' AND n.id_klienci IS NOT NULL GROUP BY id
toolmaniak
Próbowałem cos podobnego z LEFT JOIN ale po pierwsze długo działało, a po drugie to tak jak w Twoim zapytaniu wywala tylke te rekordy które mają zdefiniowane id_klienci w tabeli notatki.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.