Temat: Użytkownicy Oracle10g

Witam;
Potrzebuje przenosić użytkowników z jednej bazy do drugiej za pomocą migawki.
Robie coś takiego:
1) Łączę sie za pomocą łącznika z bazą źródłową

CREATE DATABASE LINK <Nazwa łącznika>
CONNECT TO <nazwa użytkownika za pomocą którego sie łącze>IDENTIFIED BY VALUES <hasło> USING <połączenie skonfigurowane w tnsnames>;

I połączenie działa
2) Robię replikę kont użytkowników (tylko z powodu ze nie mogę założyć dziennika replika jest robiona całościowa a nie przyrostowa)
CREATE MATERIALIZED VIEW uzytkownicy
build immediate
refresh complete
start with sysdate+(1/(24*60*30))
next sysdate+(1/(24*60*30))
as
select * from <właściciel>.<nazwa tabeli>@<nazwa łącznika>;

I teraz jak z tak uzyskanej tabeli w której mam nazwę użytkownika i hasło utworzyć nowe konto w bazie? próbowałem za pomocą triggera ale nie ma możliwości stworzenia na tej tabeli triggeraAlekasnder Nowak edytował(a) ten post dnia 17.10.10 o godzinie 13:51
Grzegorz D.

Grzegorz D. PL/SQL Developer

Temat: Użytkownicy Oracle10g

Co tak na prawdę chcesz zrobić?

1. Przenieść użytkowników Oracla z jednej bazy do drugiej wraz z obiektami, które do nich należą? (np użytkownik A - tabele aa, bb, cc)

2. Przenieść użytkowników Oracla z jednej bazy do drugiej bez obiektów (tworzysz schematy bez obiektów, mimo, że na bazie, z której pobierasz użytkowników te obiekty się znajdują) np. użytkownik A ma tabele aa, bb,cc - "przenosisz" (czyli tworzysz) na drugiej bazie użytkownika A i tyle

3. Masz jakichś użytkowników nie-Oraclowych (np tabela zawierająca loginy i hasła) i chcesz stworzyć tych użytkowników pod drugą bazą?

Sprawdź czy taki skrypt http://toolkit.rdbms-insight.com/gen_cre_users.php nie spełni twoich oczekiwań.

Pokaż też tego niedziałającego triggera.

konto usunięte

Temat: Użytkownicy Oracle10g

Alekasnder Nowak:
Potrzebuje przenosić użytkowników z jednej bazy do drugiej za pomocą migawki.

Masz odgórny przykaz, że musi to być "migawka" ? Jeśli to twój
własny wybór ... to zrezygnuj z niego.

Przy takiej ilości rekordów (sugeruję się tu słowem "użytkownicy") najprościej jest porównywać to ręcznie: zakładać brakujące, blokowac/kasować usunięte na bazie źródłowej.

Ewentualnie na bazie podstawowej zakładasz trigger on ddl i tam sprawdzasz co zrobiono, a jesli to było create user to wysyłasz inserta do drugiej bazy "przez łącznik :)".

http://damir-vadas.blogspot.com/2010/06/audit-ddl-oper...
2) Robię replikę kont użytkowników (tylko z powodu ze nie mogę założyć dziennika replika jest robiona całościowa a nie przyrostowa)

Czemu nie możesz założyć loga ?

BTW. W "życiu codziennym" DBA rzadko używa się takich akademickich nazw. Dużo lepiej jest używać nazw oryginalnych (angielskich), chociaż by po to, żeby się rozumieć z innymi DBA :)

konto usunięte

Temat: Użytkownicy Oracle10g

Grzegorz Drzymała:
http://toolkit.rdbms-insight.com/gen_cre_users.php nie spełni twoich oczekiwań.

BTW. Wszystkie takie i podobne skrypty są lekko ułomne ponieważ nie przenoszą uprawnień do resource managera :)

Temat: Użytkownicy Oracle10g

Grzegorz Drzymała:
Co tak na prawdę chcesz zrobić?

2. Przenieść użytkowników Oracla z jednej bazy do drugiej bez obiektów (tworzysz schematy bez obiektów, mimo, że na bazie, z której pobierasz użytkowników te obiekty się znajdują) np. użytkownik A ma tabele aa, bb,cc - "przenosisz" (czyli tworzysz) na drugiej bazie użytkownika A i tyle

Przenieść użytkowników z innej bazy danych Oracla do której mam tylko wgląd, nie mogę nic w niej "mieszać" - tworzyć nowych tabel , dzienników itp, a z tego co wiem żeby zrobić replikę przyrostową to na bazie źródłowej muszę założyć dziennik, a takiej czynności zrobić nie mogę.
Z tym triggerem jest taki problem ze po pierwsze nie wiem na jaką akcje go ustawić, bo jeśli tabela za każdym razem jest pobierana w całości to chyba ani INSERT ani UPBADE nie zadziała. Czy a jeśli tak to jak w triggerze mogę utworzyć nowego użytkownika. Próbowałem w następujący sposób:

CREATE OR REPLACE TRIGGER TRIGGER1
BEFORE INSERT OR DELETE OR UPDATE ON <tabela>
BEGIN
CREATE USER "gosc" IDENTIFIED BY VALUES 'test' TEMPORARY TABLESPACE "TEMP";
END;

I zamiast "gosc" i 'test' chciałem żeby pobierał dane o nowych użytkownicjach założonych w bazie źródłowej

konto usunięte

Temat: Użytkownicy Oracle10g

Alekasnder Nowak:
Przenieść użytkowników z innej bazy danych Oracla do której mam tylko wgląd, nie mogę nic w niej "mieszać" - tworzyć nowych tabel , dzienników itp

Czyli ... jesteś klientem bez uprawnień R/W :)

Nadal najprosciej jest cyklicznie odpytywać DBA_USERS i szukać różnic. W końcu ... takie transakcje nie odbywają się kilka(set) razy na sekundę.
Grzegorz D.

Grzegorz D. PL/SQL Developer

Temat: Użytkownicy Oracle10g

Alekasnder Nowak:
Grzegorz Drzymała:
Co tak na prawdę chcesz zrobić?

2. Przenieść użytkowników Oracla z jednej bazy do drugiej bez obiektów (tworzysz schematy bez obiektów, mimo, że na bazie, z której pobierasz użytkowników te obiekty się znajdują) np. użytkownik A ma tabele aa, bb,cc - "przenosisz" (czyli tworzysz) na drugiej bazie użytkownika A i tyle

Przenieść użytkowników z innej bazy danych Oracla do której mam tylko wgląd, nie mogę nic w niej "mieszać" - tworzyć nowych tabel , dzienników itp, a z tego co wiem żeby zrobić replikę przyrostową to na bazie źródłowej muszę założyć dziennik, a takiej czynności zrobić nie mogę.

Czy skrypt, który podałem wcześniej nie jest dla ciebie wystarczający? Odpytujesz jedynie przez DBLINK perspektywy dba_users i dba_ts_quotas. Wynik otrzymujesz w postaci (w kolejnych wierszach):


create user xxxx identified by values 'xxxx'
default tablespace xxxx
temporary tablespace TEMP
profile DEFAULT
quota UNLIMITED on xxx account lock;

create user xxxx identified by values 'xxxx'
default tablespace xxxx
temporary tablespace TEMP
profile DEFAULT
quota UNLIMITED on xxxx;

Z tym triggerem jest taki problem ze po pierwsze nie wiem na jaką akcje go ustawić, bo jeśli tabela za każdym razem jest pobierana w całości to chyba ani INSERT ani UPBADE nie zadziała. Czy a jeśli tak to jak w triggerze mogę utworzyć nowego użytkownika. Próbowałem w następujący sposób:

CREATE OR REPLACE TRIGGER TRIGGER1
BEFORE INSERT OR DELETE OR UPDATE ON <tabela>
BEGIN
CREATE USER "gosc" IDENTIFIED BY VALUES 'test' TEMPORARY TABLESPACE "TEMP";
END;

I zamiast "gosc" i 'test' chciałem żeby pobierał dane o nowych użytkownicjach założonych w bazie źródłowej

Pomiędzy begin i end nie bardzo się da w takiej formie wywoływać operacje DDL.
Musisz użyć execute immediate.

Temat: Użytkownicy Oracle10g

TAK, ale chodzi o automatyzację. Użytkownik logujący sie do bazy źródłowej ma taki sam login i hasło jak do nowej bazy. Usunięcie kąta, zmiana hasła w bazie źródłowej automatycznie jest aktualizowana w nowej bazie. Tylko w nowej bazie ma inne uprawnienia, ale uprawnienia będą nadawane i modyfikowane niezależnie (oddzielnie na bazie źródłowej, oddzielnie na bazie docelowej)
Grzegorz D.

Grzegorz D. PL/SQL Developer

Temat: Użytkownicy Oracle10g

Alekasnder Nowak:
TAK, ale chodzi o automatyzację. Użytkownik logujący sie do bazy źródłowej ma taki sam login i hasło jak do nowej bazy. Usunięcie kąta, zmiana hasła w bazie źródłowej automatycznie jest aktualizowana w nowej bazie. Tylko w nowej bazie ma inne uprawnienia, ale uprawnienia będą nadawane i modyfikowane niezależnie (oddzielnie na bazie źródłowej, oddzielnie na bazie docelowej)

Wydaje mi się, że wystarczy:

1. Stworzenie listy użytkowników na podstawie wcześniejszego skryptu (to pierwsza akcja - wykonywana jednorazowo)
2. Później job oraclowy odpalający procedurę co jakiś tam czas, która:
a) do kursora wsadzi różnicę pomiędzy dba_users np:

kursor 1

select username, password from dba_users@link
minus
select username, password from dba_users


kursor 2

select username from dba_users
minus
select username from dba_users@link


Dla wierszy z kursora 1:
b) Użytkownik, który istniał już w bazie docelowej (username), a któremu zmieniło się jedynie hasło w bazie źródłowej


alter user user_name identified by new_password;


c) Nowy użytkownik - create user...

Dla wierszy z kursora 2
d) Usuń użytkownika - drop user...

Taki luźny pomysł...

Edit:

Czyli w zasadzie to co napisał Krzysztof - odpytywanie dba_usersGrzegorz Drzymała edytował(a) ten post dnia 17.10.10 o godzinie 19:44

konto usunięte

Temat: Użytkownicy Oracle10g

Grzegorz Drzymała:
Czyli w zasadzie to co napisał Krzysztof - odpytywanie dba_users

Mnie osobiście ... "usunięcie kąta" ... jakoś nie działa :)

konto usunięte

Temat: Użytkownicy Oracle10g

Alekasnder Nowak:
CREATE OR REPLACE TRIGGER TRIGGER1
BEFORE INSERT OR DELETE OR UPDATE ON <tabela>
BEGIN
CREATE USER "gosc" IDENTIFIED BY VALUES 'test' TEMPORARY TABLESPACE "TEMP";
END;


BEGIN
execute immediate 'CREATE USER ' || tujakistekst || ' IDENTIFIED BY VALUES "' || tujakieshaslo '" TEMPORARY TABLESPACE TEMP';
END;

Temat: Użytkownicy Oracle10g

Witam ponownie;
Nie mogłem wcześniej przetestować, ale teraz stworzyłem procedurę wygląda następująco:

create or replace
procedure test1
is login VARCHAR2(30 BYTE);
haslo VARCHAR2(30 BYTE);
haslo1 VARCHAR2(30 BYTE);
begin
select username, password into login, haslo from dba_users@<łącznik>
minus
select username, password from user_bd;
execute immediate 'CREATE USER '||login||' IDENTIFIED BY VALUES ''' ||haslo ||''' TEMPORARY TABLESPACE TEMP';
end;

Zdaje sobie sprawę że to jest jeszcze nie kompletna procedura, ponieważ działa poprawnie jeśli bazy różnią się tylko jedną pozycją, ale w chwili obecnej mam taką sytuację w bazie.

1) Ale podczas wywołania procedury krzyczy mi:

$Oracle.EXCEPTION_ORA_1031:
ORA-01031: insufficient privileges
ORA-06512: at "SYSTEM.TEST1", line 10
ORA-06512: at line 2

Rozumiem że chodzi o uprawnienia ale procedurę stworzyłem na koncie "system" i wywoływałem także na koncie "system"

2) Dlaczego w powyższej procedurze w zapytaniu nie mogę odwołać się do tabeli dba_users
"select username, password from dba_users;"
musiałem to ominąć poprzez stworzenie migawki i dopiero działa poprawnie
"select username, password from user_bd;"Alekasnder Nowak edytował(a) ten post dnia 18.10.10 o godzinie 19:25

konto usunięte

Temat: Użytkownicy Oracle10g

Alekasnder Nowak:
$Oracle.EXCEPTION_ORA_1031:
ORA-01031: insufficient privileges
ORA-06512: at "SYSTEM.TEST1", line 10
ORA-06512: at line 2

Rozumiem że chodzi o uprawnienia ale procedurę stworzyłem na koncie "system" i wywoływałem także na koncie "system"

2) Dlaczego w powyższej procedurze w zapytaniu nie mogę odwołać się do tabeli dba_users

O ile pamietam to system nie ma uprawnien do create user.

Co do pkt 2 to będzie cos mozna powiedziec wtedy jak załaczysz komunikat bledu.

Sorry za pismo, ale w pierwszym wagonie intercity strasznie trzesie :)

Temat: Użytkownicy Oracle10g

Ale jak z wykonuje polecenie:"
CREATE USER login IDENTIFIED BY VALUES 'haslo' TEMPORARY TABLESPACE TEMP;"
z poziomu użytkownika "system" to nowe konto zakłada sie bez problemu. Problem powstanie w momencie jak to samo polecenie chcę wykonać w procedurze.

kod do pkt 2
Error(6,1): PL/SQL: SQL Statement ignored
Error(8,32): PL/SQL: ORA-00942: table or view does not exist

linia 6 to "select username, password into login, haslo from dba_users@<łącznik>"
a 8 to "select username, password from dba_users;"

i jak zmienie "dba_users" na migawkę user_db" wszystko jest OK
Grzegorz D.

Grzegorz D. PL/SQL Developer

Temat: Użytkownicy Oracle10g

kod do pkt 2
Error(6,1): PL/SQL: SQL Statement ignored
Error(8,32): PL/SQL: ORA-00942: table or view does not exist

linia 6 to "select username, password into login, haslo from dba_users@<łącznik>"
a 8 to "select username, password from dba_users;"

i jak zmienie "dba_users" na migawkę user_db" wszystko jest OK

Zamiast dba_users spróbuj sys.dba_users.

A jeżeli nie działa, to może trzeba dać uprawnienia z sysa na użytkownika system - grant select any dictionary to system; ?

Temat: Użytkownicy Oracle10g

Dzięki, już pobiera z tabeli dba_users:)
Tylko nadal mam problem z tworzeniem użytkowników w procedurze. Czy tu też potrzebne są jakieś specjalne uprawnienia? Jeśli tak to jakie?
Grzegorz D.

Grzegorz D. PL/SQL Developer

Temat: Użytkownicy Oracle10g

Najprawdopodobniej musisz dodać uprawnienie bezpośrednio, a nie przez rolę (create user jest w roli dba). Z użytkownika sys - grant create user to system.

konto usunięte

Temat: Użytkownicy Oracle10g

Alekasnder Nowak:
Dzięki, już pobiera z tabeli dba_users:)
Tylko nadal mam problem z tworzeniem użytkowników w procedurze. Czy tu też potrzebne są jakieś specjalne uprawnienia? Jeśli tak to jakie?

Jeśli do wykonania DDLa jest potrzebny jakiś przywilej to ... jeśli chcesz to samo wykonać w procedurze to ... musisz właścicielowi tej procedury nadać ten przywilej bezpośrednio, a nie przez rolę.

Oczywiście jest też możliwość takiego zadeklarowania procedury, żeby była wykonywana z uprawnieniami wywołującego. Ale właściciel procedury i tak musi mieć te uprawnienia, żeby dało się ją skompilować.

Ale długie zdanie mi wyszło ...

Temat: Użytkownicy Oracle10g

Dzięki waszej pomocy udało się zbudować procedurę, która robi to co chciałem.
Ale mam jeszcze jedno pytanie jak tą procedurę oprawićtak aby wykonywała się automatycznie (systematycznie np. co 5 min)
Grzegorz Drzymała:
2. Później job oraclowy odpalający procedurę co jakiś tam czas, która:

Jak zrobić taki job??

konto usunięte

Temat: Użytkownicy Oracle10g

Alekasnder Nowak:
Jak zrobić taki job??

Google: DBMS_JOB, DBMS_SCHEDULER

Następna dyskusja:

Szkolenie z Oracle10g




Wyślij zaproszenie do