Thema: Oracle User

@Thomas,

Deine Frage, wer wohl 1000e von Datensaetze loescht hat mich dazu bewogen, in die Prozedur zum Fuellen der temporaeren Tabellen noch eine Loeschabfrage reinzubauen. Mit
SELECT DISTINCT audsid FROM sys.v_$session WHERE audsid <> 0;
bekomme ich alle SessionIDs der angemeldeten Nutzer heraus. Wenn ich diese Abfrage als Cursor deklariere
     Cursor allSessionUser Is
         SELECT DISTINCT audsid FROM sys.v_$session WHERE audsid <> 0;
meckert aber der Compiler rum. Der Fehler ist PLS-00201. Nun mag es ja an den Rechten liegen (eine der Bemerkungen zu dem Fehler), aber da frage ich mich, warum ich dann die Abfrage ausfuehren kann.

Hast Du ne Ahnung wie ich das Problem beheben kann?

Danke Thomas

5 min spaeter:

Habs gerade als sys eingespielt und siehe da - es geht. Das ist aber natuerlich bloed.
Ist aber immer noch die Frage, warum ich das view abfragen, via pl/sql aber nicht benutzen kann.
 
  <small>[ 14-10-2002, 18:02: Beitrag editiert von: wintelknecht ]</small>

2

Re: Oracle User

Hiho  <img border="0" title="" alt="[Lächeln]" src="images/icons/smile.gif" />

Kleine Frage (weil Du´s irgendwie so betont hattest dass Du es als sys eingespielt hast):
Du versuchst, die View als ein gewisser Benutzer auszulesen (aus dem PL/SQL heraus)?
Könnte es evtl. sein, dass dieser User, der das PL/SQL aufruft garkeine Select-Rechte auf die v$sessions oder sonst eine System-View hat? (Sys hat die immer, ist ja auch der Wichtige  <img border="0" title="" alt="[Breites Grinsen]" src="images/icons/grin.gif" />  )

Oder rufst Du das PL/SQL auch als Sys auf?

Thomas

Beleidigungen sind die Argumente derer, die keine Argumente haben

Re: Oracle User

Hallo,

ich bin bspw. NutzerA (mit relativ grossen Rechteumfang  <img border="0" title="" alt="[Lächeln]" src="images/icons/smile.gif" /> ) und kann als NutzerA das view auch abfragen (sagen wir mal im SQLPlus). Ich versuche als NutzerA die Prozedur zu compilieren/Einzuspielen --> Fehler. Das ist es ja eben was mich wundert.

Gruss und schoenen Abend Thomas

4

Re: Oracle User

Versuch vielleicht mal die v$session abzufragen und nicht v_$session.
Da gibt es anscheinend Unterschiede im Oracle...
(zumindest hab ich mal sowas ähnliches erlebt...)

HTH, Thomas

Beleidigungen sind die Argumente derer, die keine Argumente haben

5

Re: Oracle User

Kleine Ergänzung, hab grad was gefunden:
</font><blockquote><font size="1" face="Verdana, Helvetica, sans-serif">Code:</font><hr /><pre style="font-size:x-small; font-family: monospace;">Problem Description
-------------------
When building a Stored program unit, a cursor that is selecting from  a dynamic view, e.g.,
v$session, results in the following error:
PLS-00201 identifier name must be declared.
For example, the following program illustrates this problem:

create or replace function getosuser return varchar2 is
retval varchar2( 100 );
begin
    select osuser into retval
    from v$Session
    where audsid=(select  userenv ('sessionid') from dual);
    return retval;
end;
/

LINE/COL ERROR
-------- -------------------------------------------------------
4/3      PL/SQL: SQL Statement ignored
4/34     PLS-00201: identifier 'SYS.V_$SESSION' must be declared

Granting the select privileges only results in the following error:
SQL> GRANT SELECT ON v$session TO SCOTT;
GRANT SELECT ON v$session TO SCOTT
* ERROR at line 1: ORA-02030: can only select from fixed tables/views


Solution Description
--------------------
To correct this problem, GRANT SELECT ANY TABLE TO SCOTT; where SCOTT  is the userid, or PUBLIC. 
This gives enough permissions to be able to  select from the dynamic view. [/code]</blockquote><font size="2" face="Verdana, Helvetica, sans-serif">Versuch das mal, klingt zumindest arg nach Deinem Problem.

Tink/ Thomas
 
  <small>[ 15-10-2002, 09:21: Beitrag editiert von: Tink ]</small>

Beleidigungen sind die Argumente derer, die keine Argumente haben

Re: Oracle User

Hallo,

hab gerade ein 19-seitiges Pamphlet ausgearbeitet und bin jetzt gluecklich fertig.

Nur so:
Das die bei Oracle auch nur Mensche sind sieht man sehr schoen an:
"...select osuser into retval from v$Session.."
...
"4/34     PLS-00201: identifier 'SYS.V_$SESSION' must be declared"
Die Abfrage lief auf die Tabelle v$Session und nicht auf das view SYS.V_$SESSION  <img border="0" title="" alt="[Lächeln]" src="images/icons/smile.gif" />

Ob man das View oder die Tabelle abfragt ist, denke ich egal. Die Definition von dem view ist
select .... from v$session
HAHHH - jetzt kommts (habs gerade gesehen) - und hat das Synonym Public.V$Session (vielleicht sollte ich hier was mit den Rechten tun?).

Der Auszug (aus der KnowlegdeBase?) beschreibt genau mein Problem. Aber was ich machen soll ist mir nicht ganz klar. Ich kann doch nicht allen Nutzer ein GRANT SELECT ANY TABLE einraeumen? Oder nur dem, auf den ich die Prozedur grante?

Mit den Rechten hab ichs nicht so sehr - bei Bedarf muss es halt sein. Aber wenn nicht, dann lieber nicht.

Gruss Thomas

7

Re: Oracle User

Hiho  <img border="0" title="" alt="[Lächeln]" src="images/icons/smile.gif" />

Also:

Wer ruft denn diese komische Prozedur auf? Alle Benutzer in der Datenbank?
Wenn ja, dann brauchen die auch alle das Recht "SELECT ANY TABLE"...
Jedem Benutzer dieses Recht zu geben geht mit:
GRANT SELECT ANY TABLE TO public;
(als Sys)

Aber wenn auch nur ein Oracle-User diese Prozedur aufruft, dann braucht nur der das Recht (das steht aber in meinem obigen Auszug drin; vorletzte Zeile)

Mit dem Synonym könnte es auch zusammenhängen, aber da bin ich nich so fit drin leider...

Hoffe es hilft Dir trotzdem weiter  <img border="0" title="" alt="[Lächeln]" src="images/icons/smile.gif" />

GruÃ?, Tink/ Thomas

Beleidigungen sind die Argumente derer, die keine Argumente haben

Re: Oracle User

Ich habe eine Rolle erzeugt - sagen wir mal AUserRolle. Dieser Rolle werden n Nutzer zugeordnet. Damit muesste ich also der Rolle die systemweite Berechtigung select einraeumen. Und das erscheint mir etwas weit gegriffen. Ich muss noch mal ueberlegen was und ob das fuer Konsequenzen hat. Und zur Not weise ich die Prozedur halt dem sys zu. Die Oracle-Nutzerverwaltung (das wo ich nach dem dbms_sql.execute() gefragt habe) ist zwangslaeufig ja auch schon auf den sys gewiesen.

Dank Dir auf jeden Fall.

P.S.:
"Wer ruft denn diese komische Prozedur auf?" Ist keine KOMISCHE Prozedur - die ist genial (Ist ja auch von mir geschrieben  <img border="0" title="" alt="[Breites Grinsen]" src="images/icons/grin.gif" /> ), da sie einen haufen admin-Taetigkeit erspart  <img border="0" title="" alt="[Winken]" src="images/icons/wink.gif" />

Thomas

Re: Oracle User

Ich kann leider keinen einzigen Beitrag erstellen <img src="/forum/images/graemlins/frown.gif" alt="" /> deshalb poste ich mal in paar Posts ^^

Hallo,
ich befinde mich gerade im Aufbau einer Schulung und würde gerne testen wie schwer die folgenden Aufgaben für die "Allgemeinheit" ist. Es wäre nett wenn Ihr Euch mal an die Aufgaben setzt und mit sagt wielange Ihr dafür gebraucht habt.
Vielen Dan im Voraus schonmal für Eure Mühen... naja eigentl. sollte es ja Spass machen <img src="/forum/images/graemlins/wink.gif" alt="" />

cYa
Mix

Aufgabe 1:
Schreiben Sie einen Block, der überprüft, ob ein bestimmter Mitarbeiter (identifiziert über Name und Vorname) existiert.
Übergeben Sie Name und Vorname jeweils über eine PL*SQL-Austauschvariable.

Aufgabe 2:
Schreiben Sie einen Block, der ermittelt, an wie vielen Projekten ein bestimmter Mitarbeiter aktuell arbeitet. Beachten Sie hierbei bitte die Spalteninhalte von Beginn und AbgeschlossenKnz. Geben Sie die Projekte (Attribute: Name, Beginn, etc. ) auf dem Bildschirm aus.
Fragen Sie die Mitarbeiter-ID. über die ACCEPT-Anweisung ab.

Aufgabe 3:
Erzeugen Sie einen Block, der die Spitzenverdiener bestimmt.
a) Übernehmen Sie eine Zahl als Benutzereingabe über eine SQL*Plus Austauschvariable) Geben Sie in einer Schleife die Nachnamen und Gehälter der n Spitzenverdiener auf dem Bildschirm aus. Geben Sie alternativ zu Punkt b die ermittelten Daten erst in eine PL/SQL Tabelle ein, und dann erst auf dem Bildschirm aus.

Aufgabe 4:
Für einen betriebsinternen Wettbewerb sollen die Mitarbeiter nach Gehaltshöhe absteigend in 2-Personen Gruppen eingeteilt werden. (Baumgarten und Schneider sind z.B. in der ersten Gruppe. Die gebildeten Gruppen sollen mit der Nummer der Gruppe, dem Durchschnittsgehalt und den Teilnehmern der Gruppe in einer PL/SQL-Tabelle abgelegt werden

Aufgabe 5:
a) Fügen Sie der Tabelle Mitarbeiter eine Spalte mit dem Name Grafik
hinzu. Füllen Sie über einen PL/SQL-Block die Spalte mit Sternchen entsprechend der folgenden Systematik. Jeder Mitarbeiter erhält je volle 100 € Gehalt ein Sternchen in die Spalte
Beispiel:
Klaumann 2700 ***************************
c) Nutzen Sie die Klauseln FOR UPDATE und WHERE CURRENT OF.