Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ Oracle _ Uprawnienia Select do tabel dynamicznych

Napisany przez: primo102 2.01.2013, 21:29:01

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

Napisany przez: redman2 2.01.2013, 21:34:18

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

Napisany przez: primo102 3.01.2013, 11:22:01

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;
/

Napisany przez: redman2 3.01.2013, 11:25:51

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.

Napisany przez: primo102 3.01.2013, 13:41:24

OK DZIĘKI ZA PODPOWIEDŹ TERAZ JUŻ DAM RADĘ.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)