Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Uprawnienia Select do tabel dynamicznych
Forum PHP.pl > Forum > Bazy danych > Oracle
primo102
Witam

Mam problem z nadaniem uprawnień w bazie Oracle (tylko do SELECT) do tabel dynamicznych czyli tabel które tworzą się codziennie z początkiem TB i z kolejnym numerem porządkowym - na razie codziennie dodaje uprawnienia do konkretnej tabeli. A chciałbym nadać uprawniania na stałem danemu użytkownikowi do wszystkich tabel zaczynających się od nazwy TB (podpiętych po użytkownika HR nie wiem czy to ważne)

teraz muszę codziennie
wklepywać :
grant select on HR.TB000.. to user1

a własnie chodzi mi czy jest możliwość wpisania polecenia coś w stylu:
grant select on any TB.* where tables like ('TB%')

ale nie działa nic takiego nie wiem może coś źle wpisuje, albo inne pomysły questionmark.gif
redman2
Napisz procedurę pl/sql z kursorem, w którym zapiszesz dynamiczne generowanie uprawnień:
  1. SELECT 'grant select on ' || table_name || ' to user1;' FROM dba_tables WHERE table_name LIKE 'TB%'


Kursor ten czytaj w pętli i wykonuj go execute immediate ....

Procedurę zaś zapisz do programu i uruchamiaj cyklicznie przez dba_scheduler'a.

Pozdrawiam
primo102
OK

myślę że tak jest dobrze:

BEGIN
FOR P IN (SELECT TABLE_NAME
FROM ALL_TABLES
WHERE TABLE_NAME LIKE 'TB%')
LOOP
EXECUTE IMMEDIATE 'grant select on '||P.TABLE_NAME|| ' to user1';
END LOOP;
END;


tylko nie bardzo rozumiem jak mam zapisać te procedurę do programu !?




a może wystarczy coś takiego- job który będzie wykonywał ten blok raz dziennie 0 12 00 questionmark.gif





BEGIN
SYS.DBMS_SCHEDULER.CREATE_JOB (
job_name => '"HR"."uprawnienie"',
job_type => 'PLSQL_BLOCK',
job_action => 'BEGIN
FOR P IN (SELECT TABLE_NAME
FROM ALL_TABLES
WHERE TABLE_NAME LIKE ''TB%'')
LOOP
EXECUTE IMMEDIATE ''grant select on ''||P.TABLE_NAME|| '' to user1'';
END LOOP;
END;',
number_of_arguments => 0,
start_date => TO_TIMESTAMP_TZ('2013-01-03 11:19:18 Europe/Belgrade','YYYY-MM-DD HH24.MI.SS TZR'),
repeat_interval => 'FREQ=DAILY;BYHOUR=12;BYMINUTE=0;BYSECOND=0',
end_date => NULL,
job_class => '"SYS"."DEFAULT_JOB_CLASS"',
enabled => FALSE,
auto_drop => FALSE,
comments => 'only select to user1');

SYS.DBMS_SCHEDULER.SET_ATTRIBUTE(
name => '"HR"."uprawnienie"',
attribute => 'logging_level', value => DBMS_SCHEDULER.LOGGING_OFF);

SYS.DBMS_SCHEDULER.enable(
name => '"HR"."uprawnienie"');
END;
/
redman2
Job, program, procedura, funkcja. Cokolwiek, byle działało.
Zaproponowałem program, który będzie uruchamiany przez scheduler. Zrób, jak będzie Ci wygodniej. Idea taka sama, tylko implementacja trochę inna.
Powodzenia.
primo102
OK DZIĘKI ZA PODPOWIEDŹ TERAZ JUŻ DAM RADĘ.
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.