ďťż
 
Wybieranie danych z user lub all synonyms ďťż
 
Wybieranie danych z user lub all synonyms
Zobacz wiadomości
 
Cytat
A gdyby tak się wedrzeć na umysłów górę, / Gdyby stanąć na ludzkich myśli piramidzie, / I przebić czołem przesądów chmurę, / I być najwyższą myślą wcieloną. . . Juliusz Słowacki, Kordian
Indeks BCB i MySQL subiekt gt fototapeta
 
  Witamy

Wybieranie danych z user lub all synonyms



colin - 29-11-2005 10:12
Wybieranie danych z user lub all synonyms
  Witam

Ostatnio napotkałem drobny problem. Mianowicie:

1) Utworzyłem procedurę w schemacie A, która posiada w swojej treści
zapytanie:

SELECT TABLE_OWNER||'.'||TABLE_NAME
INTO v_user_tree
FROM ALL_SYNONYMS
WHERE SYNONYM_NAME = 'TREE'
AND OWNER = 'ZP';

2) Utworzyłem użytkownika ZP, utworzyłem dla niego synonim TREE do obiektu w
innym schemacie. Użytkownikiem ZP wywołuję procedurę z p. 1. Spodziewałem
się uzyskać odpowiedź: nazwa_schematu.nazwa_obiektu do którego odnosi się
synonim, jednak mimo wszystko otrzymuję ciąg pusty.

3) Podczas testów spotkałem się z kilkoma dziwnymi kwiatkami:

- kiedy ubrałem zapytanie w blok:

BEGIN

SELECT TABLE_OWNER||'.'||TABLE_NAME
INTO v_user_tree
FROM ALL_SYNONYMS
WHERE SYNONYM_NAME = 'TREE'
AND OWNER = 'ZP';

EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('BLAD ODCZYTU Z LISTY SYNKOW');
END;

uzyskałem błąd zgłoszony przez obsługę tego wyjątku podczas wywoływania
funkcji jako użytkownik ZP poleceniem:

select A.nazwa_funkcji from dual;

Natomiast przy wykonaniu powyższego zapytania bez tego typu bloku BEGIN/END
zapytanie po prostu przerywa działanie funkcji bez wykonywania dalszych
poleceń, bez zgłaszania jakichkolwiek błędów.

Pytanie więc brzmi: dlaczego jako użytkownik z poza schematu A zapytanie z
p.1 nie zwraca danych?

PS: jak w nazwie tematu identyczne zachowanie cechuje zapytanie do
USER_SYNONYMS.

pozdrawiam i czekam na komentarze, a najlepiej przyczynę takiego zachowania,
ew. sugestie w jaki sposób można wyłuskać te dane inną drogą

colin





colin - 01-12-2005 20:33

  Udało mi się rozwiązać problem w najbardziej nieodpowiedni sposób -
przywilej SELECT ANY TABLE dla schematu A pozwala na wybieranie danych z
poziomu procedury i zwraca dobry wynik. Jednakże tego typu uprawnienie jest
zbyt mocne. Grant'y różnego rodzaju na ALL_SYNONYMS dla schematu A nie dają
rezultatu, nawet grant'y na składowe elementy tego widoku.




=?ISO-8859-2?Q?S=B3awomir_Szysz=B3o?= - 01-12-2005 20:33

  Dnia Tue, 29 Nov 2005 10:15:30 +0100, "colin" <sscolinss@poczta.onet.pl>
wklepał(-a):

>Witam
>
> Ostatnio napotkałem drobny problem. Mianowicie:

.... nie napisałeś o jaką bazę chodzi. Ale domyślam się, że Oracle.

>1) Utworzyłem procedurę w schemacie A, która posiada w swojej treści
>zapytanie:
>
> SELECT TABLE_OWNER||'.'||TABLE_NAME
> INTO v_user_tree
> FROM ALL_SYNONYMS
> WHERE SYNONYM_NAME = 'TREE'
> AND OWNER = 'ZP';

Unikaj konstrukcji SELECT INTO - bezpieczniej jest zrobić kursor - unikniesz
błędów "Jednowierszowe zapytanie zwraca więcej niż jeden wiersz".

>2) Utworzyłem użytkownika ZP, utworzyłem dla niego synonim TREE do obiektu w
>innym schemacie. Użytkownikiem ZP wywołuję procedurę z p. 1. Spodziewałem
>się uzyskać odpowiedź: nazwa_schematu.nazwa_obiektu do którego odnosi się
>synonim, jednak mimo wszystko otrzymuję ciąg pusty.

Jako jaki użytkownik tworzyłeś synonim? Co pokazuje zapytanie:
SELECT SYNONYM_NAME, OWNER
FROM ALL_SYNONYMS
WHERE SYNONYM_NAME='TREE';

>3) Podczas testów spotkałem się z kilkoma dziwnymi kwiatkami:
>
>- kiedy ubrałem zapytanie w blok:
>
> BEGIN
>
> SELECT TABLE_OWNER||'.'||TABLE_NAME
> INTO v_user_tree
> FROM ALL_SYNONYMS
> WHERE SYNONYM_NAME = 'TREE'
> AND OWNER = 'ZP';
>
> EXCEPTION
> WHEN OTHERS THEN
> DBMS_OUTPUT.PUT_LINE('BLAD ODCZYTU Z LISTY SYNKOW');
> END;
>
>
>uzyskałem błąd zgłoszony przez obsługę tego wyjątku podczas wywoływania
>funkcji jako użytkownik ZP poleceniem:
>
>select A.nazwa_funkcji from dual;

Usuń obsługę wyjątku i podaj numer komunikatu błędu.

>Natomiast przy wykonaniu powyższego zapytania bez tego typu bloku BEGIN/END
>zapytanie po prostu przerywa działanie funkcji bez wykonywania dalszych
>poleceń, bez zgłaszania jakichkolwiek błędów.
>
>Pytanie więc brzmi: dlaczego jako użytkownik z poza schematu A zapytanie z
>p.1 nie zwraca danych?

Zapewne utworzyłeś synonim jako użytkownik A, więc on jest jego właścicielem.
--
Sławomir Szyszło mailto:slaszysz@poczta.onet.pl
Primus inter FAQires & Grand Inquisitor no.0 of pl.comp.bazy-danych
FAQ pl.comp.bazy-danych http://www.dbf.pl/faq/
Archiwum http://groups.google.com/groups?grou...mp.bazy-danych




colin - 01-12-2005 20:33

 
Użytkownik "Sławomir Szyszło" <slaszysz@poczta.onet.pl> napisał w wiadomości
news:dmikrv.1cg.1@slaszysz.poczta.onet.pl...
> Dnia Tue, 29 Nov 2005 10:15:30 +0100, "colin" <sscolinss@poczta.onet.pl>
> wklepał(-a):
>
> >Witam
> >
> > Ostatnio napotkałem drobny problem. Mianowicie:
>
> ... nie napisałeś o jaką bazę chodzi. Ale domyślam się, że Oracle.

// faktycznie, zapomniałem całkiem - jednakże dobrze się domyśliłeś

>
> >1) Utworzyłem procedurę w schemacie A, która posiada w swojej treści
> >zapytanie:
> >
> > SELECT TABLE_OWNER||'.'||TABLE_NAME
> > INTO v_user_tree
> > FROM ALL_SYNONYMS
> > WHERE SYNONYM_NAME = 'TREE'
> > AND OWNER = 'ZP';
>
> Unikaj konstrukcji SELECT INTO - bezpieczniej jest zrobić kursor -
unikniesz
> błędów "Jednowierszowe zapytanie zwraca więcej niż jeden wiersz".

Jak wiele synonimów o nazwie 'TREE' może posiadać użytkownik 'ZP' ? Szerzej,
jak wiele obiektów o nazwie 'TREE' może posiadać użytkownik 'ZP'?
(oczywiście mówimy o Oracle'u) - ale faktycznie, kursor byłby skuteczniejszy
jeżeli nie ma się zamiaru wykonywać bloku z obsługą wyjątków. W tym wypadku
mogę jedynie obawiać się błędu NO_DATA_FOUND, który najczęściej obsługuję
jako zdefiniowany wyjątek na końcu bloku programu.

>
> >2) Utworzyłem użytkownika ZP, utworzyłem dla niego synonim TREE do
obiektu w
> >innym schemacie. Użytkownikiem ZP wywołuję procedurę z p. 1. Spodziewałem
> >się uzyskać odpowiedź: nazwa_schematu.nazwa_obiektu do którego odnosi się
> >synonim, jednak mimo wszystko otrzymuję ciąg pusty.
>
> Jako jaki użytkownik tworzyłeś synonim? Co pokazuje zapytanie:
> SELECT SYNONYM_NAME, OWNER
> FROM ALL_SYNONYMS
> WHERE SYNONYM_NAME='TREE';

Synonim założyłem z poziomu użytkownika A, zapytanie w powyższej formie (bez
dodatkowego ograniczenia nazwy właściciela) zwraca wszystkie synonimy o
nazwie 'TREE' z wszystkich schematów, do których użytkownik ma dostęp, m.
in. wymieniona jest krotka z informacją o synonimie użytkownika ZP do
obiektu w schemacie A (czyli interesujący mnie obiekt).

>
> >3) Podczas testów spotkałem się z kilkoma dziwnymi kwiatkami:
> >
> >- kiedy ubrałem zapytanie w blok:
> >
> > BEGIN
> >
> > SELECT TABLE_OWNER||'.'||TABLE_NAME
> > INTO v_user_tree
> > FROM ALL_SYNONYMS
> > WHERE SYNONYM_NAME = 'TREE'
> > AND OWNER = 'ZP';
> >
> > EXCEPTION
> > WHEN OTHERS THEN
> > DBMS_OUTPUT.PUT_LINE('BLAD ODCZYTU Z LISTY SYNKOW');
> > END;
> >
> >
> >uzyskałem błąd zgłoszony przez obsługę tego wyjątku podczas wywoływania
> >funkcji jako użytkownik ZP poleceniem:
> >
> >select A.nazwa_funkcji from dual;
>
> Usuń obsługę wyjątku i podaj numer komunikatu błędu.

Jak zaznaczyłem dwie linie poniżej... bez bloku danych i obsługi błędu nie
występuje żaden komunikat o błędzie a fakt, że po tym zapytaniu przerywane
jest działanie funkcji namierzyłem jedynie poprzez wstawienie
DBMS_OUTPUT.PUT_LINE i odnotowaniu, w którym momencie oracle przestał
wysyłać komunikaty. I to właśnie ten 'kwiatek', na który chciałem zwrócić
uwagę.

>
> >Natomiast przy wykonaniu powyższego zapytania bez tego typu bloku
BEGIN/END
> >zapytanie po prostu przerywa działanie funkcji bez wykonywania dalszych
> >poleceń, bez zgłaszania jakichkolwiek błędów.
> >
> >Pytanie więc brzmi: dlaczego jako użytkownik z poza schematu A zapytanie
z
> >p.1 nie zwraca danych?
>
> Zapewne utworzyłeś synonim jako użytkownik A, więc on jest jego
właścicielem.

Polecenie:

CREATE SYNONYM ZP.ABC FOR A.MOJA_TABLICA;

wykonane z poziomu schematu A powoduje utworzenie synonimu w schemacie ZP.
Dalej zadając zapytanie z poziomu użytkownika ZP:

SELECT * FROM ALL_SYNONYMS WHERE OWNER = 'ZP'

możemy zauważyć, że to użytkownik ZP jest właścicielem synonimu więc nie
wiem, co właściwie ma to stwierdzenie do reszty sprawy (pomijając nawet
fakt, że jest nieprawdziwe).

PS: właściwie rozwiązałem problem w inny sposób, jednakże "kwiatek", który
opisałem nadal nie daje mi spokoju. Wygląda to na jakąś lukę w Oraclu, gdyż
nie zgłaszanie błędu chyba do tego typu zagadnień można zaliczyć.

pozdrawiam
colin





=?ISO-8859-2?Q?Pawe=B3_Matejski?= - 01-12-2005 20:33

  Sławomir Szyszło wrote:
>>1) Utworzyłem procedurę w schemacie A, która posiada w swojej treści
>>zapytanie:
>>
>> SELECT TABLE_OWNER||'.'||TABLE_NAME
>> INTO v_user_tree
>> FROM ALL_SYNONYMS
>> WHERE SYNONYM_NAME = 'TREE'
>> AND OWNER = 'ZP';
>
>
> Unikaj konstrukcji SELECT INTO - bezpieczniej jest zrobić kursor - unikniesz
> błędów "Jednowierszowe zapytanie zwraca więcej niż jeden wiersz".

Jaki to ma sens. Jeśli spodziewam się, że zapytanie zwróci jeden wiersz, to ma
zwrócić jaden. Jeśli zwraca więcej, to to jest sytuacja wyjątkowa i powinien być
zgłoszony wyjątek.

--
P.M.




Lucyna Witkowska - 01-12-2005 20:34

  colin <sscolinss@poczta.onet.pl> napisał:

> PS: właściwie rozwiązałem problem w inny sposób, jednakże "kwiatek", który
> opisałem nadal nie daje mi spokoju. Wygląda to na jakąś lukę w Oraclu, gdyż
> nie zgłaszanie błędu chyba do tego typu zagadnień można zaliczyć.

Mysle, ze nie jest luka w Oracle tylko swiadome dzialanie.
W tym przypadku chcesz ogladac A.all_synonyms przez uzytkownika ZP
za posrednictwem funkcji.
Gdyby cos takiego bylo mozliwe, to
Oracle musialby wybierac dla ZP tylko te synonimy, ktore odnosza sie do tabel,
ktore ZP może zobaczyc - co z kolei powodowaloby rozny obraz
A.all_synonyms dla A i ZP.

Dlatego dopiero nadanie grantu SELECT ANY TABLE "poprawilo" dzialanie, ale
nadmiernie zwiekszylo uprawnienia ZP.

Pozdrowienia,
LW




=?ISO-8859-2?Q?S=B3awomir_Szysz=B3o?= - 01-12-2005 20:34

  Dnia Wed, 30 Nov 2005 09:29:19 +0100, "colin" <sscolinss@poczta.onet.pl>
wklepał(-a):

>Synonim założyłem z poziomu użytkownika A, zapytanie w powyższej formie (bez
>dodatkowego ograniczenia nazwy właściciela) zwraca wszystkie synonimy o
>nazwie 'TREE' z wszystkich schematów, do których użytkownik ma dostęp, m.
>in. wymieniona jest krotka z informacją o synonimie użytkownika ZP do
>obiektu w schemacie A (czyli interesujący mnie obiekt).

OK.

>Jak zaznaczyłem dwie linie poniżej... bez bloku danych i obsługi błędu nie
>występuje żaden komunikat o błędzie a fakt, że po tym zapytaniu przerywane
>jest działanie funkcji namierzyłem jedynie poprzez wstawienie
>DBMS_OUTPUT.PUT_LINE i odnotowaniu, w którym momencie oracle przestał
>wysyłać komunikaty. I to właśnie ten 'kwiatek', na który chciałem zwrócić
>uwagę.

Po pierwsze - usuń blok EXCEPTION to dowiesz się, jaki naprawdę błąd występuje.
Po drugie - pokaż może pełen kod tych obu wersji procedur, bo inaczej do niczego
nie dojdziemy.

A poniżej moje testy:

User A:

create or replace function synek return varchar2 as
v_user_tree varchar2(100);
begin
SELECT TABLE_OWNER||'.'||TABLE_NAME
INTO v_user_tree
FROM ALL_SYNONYMS
WHERE SYNONYM_NAME = 'TREE'
AND OWNER = 'SCOTT';
return v_user_tree;
end;

SELECT A.SYNEK FROM DUAL;
(null)

User A as sysdba (żeby utworzyć synonim w schemacie scott):
CREATE SYNONYM scott.TREE FOR A.domeny;

SELECT A.SYNEK FROM DUAL;
A.DOMENY

User SCOTT:
SELECT A.SYNEK FROM DUAL;
ORA-00904 Niepoprawny identyfikator ...

User A:
grant execute on synek to scott;

User SCOTT:
SELECT A.SYNEK FROM DUAL;
A.DOMENY

Dziwne, u mnie działa. :)
--
Sławomir Szyszło mailto:slaszysz@poczta.onet.pl
Primus inter FAQires & Grand Inquisitor no.0 of pl.comp.bazy-danych
FAQ pl.comp.bazy-danych http://www.dbf.pl/faq/
Archiwum http://groups.google.com/groups?grou...mp.bazy-danych




=?ISO-8859-2?Q?S=B3awomir_Szysz=B3o?= - 01-12-2005 20:34

  Dnia Wed, 30 Nov 2005 14:27:51 +0100, Paweł Matejski
<madej@spam.madej.pl.eu.org> wklepał(-a):

>Jaki to ma sens. Jeśli spodziewam się, że zapytanie zwróci jeden wiersz, to ma
>zwrócić jaden. Jeśli zwraca więcej, to to jest sytuacja wyjątkowa i powinien być
>zgłoszony wyjątek.

W pewnych przypadkach lepiej jest obsługiwać wartość null zwróconą z kursora
zamiast wyjątku.
--
Sławomir Szyszło mailto:slaszysz@poczta.onet.pl
Primus inter FAQires & Grand Inquisitor no.0 of pl.comp.bazy-danych
FAQ pl.comp.bazy-danych http://www.dbf.pl/faq/
Archiwum http://groups.google.com/groups?grou...mp.bazy-danych
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • effulla.pev.pl
  • comp
    [MSSQL2000] Problem z =?ISO-8859-2?Q?tabel=B1/indeksem/zapytanie?==?ISO-8859-2?Q?m_czy_b=B3=B1d_w_bazie_danych=2E=2E=2E?= =?iso-8859-2?Q?=5BMySQL=5D_Wy=B6wietlenie_wszystkich_rekordow _zawierajacy?==?iso-8859-2?Q?ch_duplikat_a__moze_inna_struktura_bazy_danych ?= Konwesja znaków w dump'ie bazy danych - ISO -> utf-8 -> ISO -> utf-8 [laik]Jak =?ISO-8859-2?Q?stworzy=E6/zaczac_tworzyc__ma=B3=B1?==?ISO-8859-2?Q?__baz=EA_danych_na_potrzeby_www=3F?= [mysql] przenoszenie danych =?ISO-8859-2?Q?mi=EAdzy_tabelami_?==?ISO-8859-2?Q?w_r=F3=BFnych_bazach?= Ksiazka - "Podstawowy =?ISO-8859-2?Q?wyk=B3ad_z_system=F3w_?==?ISO-8859-2?Q?baz_danych=22?= Zrywanie =?ISO-8859-2?Q?po=B3aczen_z_baza_danych_-_pos?==?ISO-8859-2?Q?tgresql_=3C-=3E_odbc?= Połączenie bazy danych z wykonaniem polaczenia telefonicznego [mssql] insert do tabeli na podstawie danych z innej tabeli [oracle] Baza danych do kursy Introduction to Oracle9i:PL/SQL ? Skąd ją pobrać ?
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • nawschodzie.xlx.pl
  • Cytat

    Decede mihi sole - nie zasłaniaj mi słonca.
    Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści
    Hoc fac - tak czyń.
    A tergo - od tyłu; z tyłu.
    I czarne włosy posiwieją. Safona

    Valid HTML 4.01 Transitional

    Free website template provided by freeweblooks.com