Używam oracle 12c. Próbuję nadać użytkownikowi wszystkie uprawnienia do wszystkich tabel. W przyszłości nie muszę dodawać żadnych uprawnień temu użytkownikowi. Muszę to zrobić. Nie chcę przyznawać temu użytkownikowi tabel systemowych. Napisałem polecenie pl / sql. ale daje błąd.
BEGIN 2 FOR t IN (select * from dba_tables where owner not like "%SYS%" AND owner not like "%ADMIN%" AND iot_type IS NULL) 3 LOOP 4 EXECUTE IMMEDIATE "GRANT ALL PRIVILEGES ON "|| t.owner ||"." || t.table_name ||" TO GGSTEST"; 5 END LOOP; 6 END; 7 / BEGIN * ERROR at line 1: ORA-00905: missing keyword ORA-06512: at line 4
Jaki jest błąd? dzięki.
Używam dbms_print
GRANT ALL ON OUTLN.OL$ TO GGSTEST GRANT ALL ON OUTLN.OL$HINTS TO GGSTEST GRANT ALL ON OUTLN.OL$NODES TO GGSTEST GRANT ALL ON DBSNMP.BSLN_BASELINES TO GGSTEST GRANT ALL ON APEX_040200.WWV_FLOW_LOG_HISTORY TO GGSTEST GRANT ALL ON DBSNMP.BSLN_METRIC_DEFAULTS TO GGSTEST GRANT ALL ON XDB.XDB$ROOT_INFO TO GGSTEST GRANT ALL ON XDB.XDB$XDB_READY TO GGSTEST GRANT ALL ON XDB.XDB$CDBPORTS TO GGSTEST GRANT ALL ON XDB.XDB$IMPORT_TT_INFO TO GGSTEST GRANT ALL ON XDB.XDB$TTSET TO GGSTEST GRANT ALL ON XDB.XDB$H_INDEX TO GGSTEST GRANT ALL ON XDB.XDB$D_LINK TO GGSTEST GRANT ALL ON XDB.XDB$COLUMN_INFO TO GGSTEST GRANT ALL ON XDB.XDB$PATH_INDEX_PARAMS TO GGSTEST GRANT ALL ON XDB.X$NM7UJB7VOLFE92KV0GUML7K0LVSF TO GGSTEST GRANT ALL ON XDB.X$QN7UJB7VOLFE92KV0GUML7K0LVSF TO GGSTEST GRANT ALL ON XDB.X$PT7UJB7VOLFE92KV0GUML7K0LVSF TO GGSTEST GRANT ALL ON XDB.APP_USERS_AND_ROLES TO GGSTEST GRANT ALL ON XDB.APP_ROLE_MEMBERSHIP TO GGSTEST GRANT ALL ON XDB.XDB$DBFS_VIRTUAL_FOLDER TO GGSTEST BEGIN * ERROR at line 1: ORA-00905: missing keyword ORA-06512: at line 4
Komentarze
- Spróbuj dodać podwójne cudzysłowy do właściciela i nazwy tabeli. WYKONAJ NATYCHMIAST ' PRZYZNAJ WSZYSTKIE PRZYWILEJE NA " ' || t.owner || ' ". " ' || t.table_name || ' " DO GGSTEST ';
- UDZIEL WSZYSTKO NA IX.AQ $ _STREAMS_QUEUE_TABLE_L DO GGSTEST; to nie jest błąd. Ale pl / sql, pętla; powoduje błąd.
- następnie spróbuj tego: UDZIEL WSZYSTKO NA IX. " AQ $ _STREAMS_QUEUE_TABLE_L " DO GGSTEST Jeśli nie działa ' nie działa, może to być coś z funkcją Advanced Queue …
- What ' s rodzaj obiektu? wybierz OBJECT_TYPE, STATUS Z dba_objects gdzie właściciel = ' IX ' i object_name = ' AQ $ _STREAMS_QUEUE_TABLE_L '
- Próbowałem, ' działało. Typ statusu = TABELA i status = WAŻNY
Odpowiedź
GRANT ALL PRIVILEGES ON ....
to składnia MySQL privs.
Musisz:
GRANT ALL ON SCHEMA.TABLE TO USER
Zobacz dokumentację .
Komentarze
- Cześć, nauczyłem się, że to również składnia MySQL, ale: sprawdź to
-
grant all privileges to USERNAME
jest zupełnie inne i obejmuje całą bazę danych. - Jest sekcja zatytułowana " Nadawanie uprawnień do obiektu w tabeli użytkownikowi: przykład "
- Właściwie Bóg wie. Nie ' nie miej pod ręką bazy danych do testowania: /
- Daje ten sam błąd ..
Odpowiedź
To jest właściwe polecenie. Wcześniej powoduje to błąd z powodu tabel instalacyjnych Oracle.
BEGIN FOR t IN (select * from dba_tables where owner!="GGSTEST" AND owner not like "%SYS%" AND owner not like "%ORDDATA%" AND owner not like "%ADMIN%" AND owner not like "%APEX%" AND owner not like "%XDB%" AND owner not like "%FLOW_FILES%" AND owner not like "%OE%" AND iot_type IS NULL) LOOP EXECUTE IMMEDIATE "GRANT ALL PRIVILEGES ON "|| t.owner ||"." || t.table_name ||" TO GGSTEST"; END LOOP; END; /
Odpowiedź
problem wynika z interpretacji znaków przez PL / SQL, takich jak znak dolara lub znacznik hash. Dodając podwójne cudzysłowy, nie otrzymasz błędu.
Pozdrawiam.
Komentarze
- może hash. nie ' nie daje błędu ze znakiem dolara.
- Wykluczam schematy APEX, XDB, FLOW_FILES, ORDDATA i ' działało.
Odpowiedź
Próbuję nadać użytkownikowi wszystkie uprawnienia do wszystkich tabel.
Dlaczego?
W przyszłości nie muszę dodawać żadnych uprawnień temu użytkownikowi.
Tak, będziesz.
Gdy tylko dodasz kolejną tabelę, musisz powtórzyć cały proces i musisz to zrobić dla każdego użytkownika. Sugeruję, że to nie jest efektywne wykorzystanie czasu.
Muszę to zrobić.
Zgodzimy się nie zgodzić.
Ogromna większość użytkowników nie potrzebuje (ani nie chce) „wszystkich uprawnień” do żadnej tabeli; wystarczy wybrać, wstawić, usunąć i zaktualizować wszystko, czego potrzebują i powinni być podany.
W jaki sposób zamierzasz wyjaśnić kierownictwu, w jaki sposób doszło do awarii systemu produkcyjnego (bez względu na to, ile czasu zajmie Tobie jego odzyskanie), ponieważ jakiś użytkownik gdzieś zdecydował się upuścić tabelę tylko dlatego, że odkryli, że mogą? To nie odpowiedzialność użytkownika, więc w pierwszej kolejności nie powinni mieć do tego pozwolenia.
Przeczytaj o rolach.
Nadaj roli uprawnienia na poziomie obiektu, a następnie nadaj tę rolę [wielu] użytkownikom. Gdy modyfikujesz tabele, musisz tylko [ponownie] nadać uprawnienia odpowiednim rolom; Oracle zajmie się „kaskadowaniem” tych uprawnień do odpowiednich Użytkowników. Jeśli potrzebujesz różnych „poziomów” uprawnień dla różnych grup użytkowników, utwórz wiele ról.
Komentarze
- Chociaż może to być prawda, nigdy nie podaje informacji o tym, czy schemat się zmienia, czy środowisko jest deweloperskie czy produkcyjne, oraz jeśli ' dotyczy osobistego projektu lub jego firmy. Nigdy nie rozwiązujesz jego rzeczywistego problemu związanego ze składnią.