Seite 3 von 3 ErsteErste 123
Ergebnis 21 bis 29 von 29

Thema: View oder Tabelle je nach User

  1. #21
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.465

    Standard

    Zitat Zitat von waldi Beitrag anzeigen

    Der grundlegende Unterschied von deinem Beispiel und meinem Problem ist doch das ich gar keine Rückgabe habe sondern nur einen Aufruf.
    Mag sein. Nur, das, was zurück kommt (oder kommen soll) hat eine Tabellenstruktur, und diese muß irknwie bekannt sein.


    Dies lässt sich ausführen aber das Abfrageergebnis lautet: ERROR: a column definition list is required for functions returning "record". Sorry da hört mein Latein auf. Ich würd ja mit Rückgaben arbeiten. Aber bitte sag mir doch mal einer was ich als Rückgabe für eine Abfrage angeben muss.
    Guggst Du: http://archives.postgresql.org/pgsql...1/msg00904.php
    Siehst nur auf den ersten Blick spanisch aus ;-)

    Wenn ich nun widerum durch die Abfrage latschen muss wie du schon oben beschrieben hast, dann ist das alles umsonst weil ich eine unterschiedliche Anzahl von Spalten habe. Und somit würden wir uns immer im Kreis bewegen.
    Code:
    test=# select * from foo;
     a | b | c
    ---+---+---
     1 |   | 3
    (1 row)
    
    Time: 0.686 ms
    test=*# create or replace function abc() returns setof record as $$begin select * from foo; end; $$language plpgsql;
    CREATE FUNCTION
    Time: 3.803 ms
    test=*# select *  from abc() as (a int, b int, c int);
    ERROR:  SELECT query has no destination for result data
    HINT:  If you want to discard the results, use PERFORM instead.
    Naja so ich hoffe das jetzt klar ist wo das Problem liegt. Ich komm auf jeden Fall nicht mehr weiter. Wenn du hier angekommen bist: Nochmal dankeschön
    Meinst Du hier?

    Vielleicht bin ich auch zu müde, außerdem hab ich grad noch was anderes vor um diese Zeit. Ich versuch morgen noch mal, Dein Problem chronologisch zu erfassen...

    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  2. #22
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.465

    Standard

    Zitat Zitat von waldi Beitrag anzeigen
    Hallo PG'ler

    Ich möchte das wenn sich Leute aus der Rolle x anmelden diese die Tabelle Person sehen. Wenn sich Leute aus Y anmelden sollen sie statt Person die View PersonV sehen.

    Kann ich sowas machen? Irgendwie Automatisch? mit Trigger? Script? Transaktion???

    Wenn ja wie??

    Vielen Dank im vorraus für die Eventuelle Antwort ;-)


    Waldi
    Vielleicht kommst Du einfach zum Ziel, wenn Du für die Leute aus Y ein eigenes Schema anlegst, in dem der View liegt und diese auch keinen Zugriff auf das Schema mit der Table haben.

    Dazu dann halt den Parameter SEARCH_PATH passend setzen:

    Code:
    ALTER ROLE name SET parameter { TO | = } { value | DEFAULT }
    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  3. #23
    waldi ist offline Benutzer
    Registriert seit
    22.12.2006
    Beiträge
    67

    Standard

    Guggst Du: http://archives.postgresql.org/pgsql...1/msg00904.php
    Siehst nur auf den ersten Blick spanisch aus ;-)
    Stimmt auf den ersten Blick. Und auf den zweiten auch. Ich bezieh mich hier auf die 3. Antwort. Ich denke mal das da die Antwort drinsteht.

    Code:
    regsalida (deptid int, deptname text);
    Ich soll so eine Funktion erstellen. Aber was hat die für einen Sinn?

    Pero al ver tu funcion veo que devuelves un select * from osea toda la tabla y si es asi te recomiendo que cambias el tipo devuelto de tu funcion a el tipo de la tabla que haces el select RETURNS SETOF record AS cambialo a setof nota(o como se llame tu tabla)
    Davon versteh ich auch nichts. Kann einer von euch Spanisch?

    Code:
    declare  resultado record;
    cambialo por
    declare resultado nota%rowtype;
    y debe funcionar
    1 ist klar, 2 das ist spanisch, 3 vom sinn her: ich soll resultado (also
    ein record) deklarieren mit tabellenname%rowtype , 4 es sollte dann
    funktionieren??

    2 versteh ich nicht
    3 so?? r person%rowtype; Das funktioniert nicht. Syntax error

    r tabellename%rowtype funktioniert. Bringt aber nichts gleiche Fehlermeldung.

  4. #24
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.465

    Standard

    Zitat Zitat von waldi Beitrag anzeigen
    Stimmt auf den ersten Blick. Und auf den zweiten auch. Ich bezieh mich hier auf die 3. Antwort. Ich denke mal das da die Antwort drinsteht.
    Ziehe das mal bitte nicht so aus dem Kontext, wo ich die Antwort gab. Ich meinte exakt die Mail, die ich nannte, und auch nicht das dort zitierte, sondern das geschriebene. Ganz konkret, ich habe nur Deine Fehlermeldung an Google verfüttert und u.a. das erhalten. Und ganz konkret meinte ich dies hier:

    Code:
    select * from f_a_prrueba3() as (campo1 int, campo2 varchar(30), etc, etc);
    Ich kann kein spanisch, leidlich englisch und a bissl deutsch, aber diese Antwort bezog sich auf:

    Code:
    > > ----------------------------------------------------------------------
    > > -------- ERROR : a column definition list is required for functions
    > > returning "record"
    > > ----------------------------------------------------------------------
    Und exakt dieses Problem hattest Du geschildert.


    Ich zeigte Dir dann noch einen kleinen Schnellschuß von mir, hier noch einmal:
    Code:
    test=# select * from foo;
     a | b | c
    ---+---+---
     1 |   | 3
    (1 row)
    
    Time: 0.686 ms
    test=*# create or replace function abc() returns setof record as $$begin select * from foo; end; $$language plpgsql;
    CREATE FUNCTION
    Time: 3.803 ms
    test=*# select *  from abc() as (a int, b int, c int);
    ERROR:  SELECT query has no destination for result data
    HINT:  If you want to discard the results, use PERFORM instead.
    Da hab ich das, was in der spanischen Mail stand, demonstriert. Und dazu noch die nächste Fehlermeldung, die Du bei Deinem gezeigten Code bekommen wirst, wenn Du das eben behandelte Problem gelöst hast:

    Code:
    ERROR:  SELECT query has no destination for result data
    HINT:  If you want to discard the results, use PERFORM instead.
    Du willst aber etwas rückgeben, also 'mußt Du durch das Ergebnis latschen'.

    Aber auch, wenn Du das geschafft hast, wirst Du ein Problem haben: Deine Zielstellung, irgend was schwammig formuliertes als Frage der DB vorzuwerfen und je nach Mondphase und Windrichtung was passendes als Antwort zu bekommen, wird so nicht gehen.

    Deshalb hatte ich einen neuen Thread gemacht, um ausgehend von der allerersten Frage und dem bisher gesammelten Wissen vielleicht einen Weg aus dem Irrgarten zu zeigen. Schade, daß zwar die letzte Antwort in diesem neuen Thread war, sich aber auf den alten bezog.


    Andreas, noch reichlich 1 Woche bis zum Urlaub...
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  5. #25
    waldi ist offline Benutzer
    Registriert seit
    22.12.2006
    Beiträge
    67

    Standard

    So habe das Problem gelöst. Auf meine Weise aber es funktioniert. Ist vielleicht auch nicht ganz sauber...aber es funktioniert. Meinungen dazu interressieren mich auf jeden Fall. Besonders die von dir Akretschmer. Vielen Dank nochmal für deine Geduld.

    Also.
    Ich habe:
    1 Tabelle person in der alles steht
    1 View->Select * from person

    Es gibt 2 Gruppen die einen sind Stäbe die anderen Leiter. Leiter dürfen nicht alles von Person sehen, Stäbe aber schon.

    Stäbe bekommen Select auf Person
    Leiter nicht, aber Select auf die View

    Hier mein Script:

    Code:
    CREATE OR REPLACE FUNCTION getperson(OUT peid integer, OUT vorname character varying, OUT nachname character varying, OUT gebdat date, OUT strasse text, OUT plz text, OUT ort text, OUT telnr text, OUT email text, OUT jahrgang integer, OUT geschlecht integer)
      RETURNS SETOF record AS
    $BODY$
    	declare r record; 
    	begin 
    		IF has_table_privilege('person', 'select') 
    		THEN
    			 for r in select * from person 
    				loop 
    					peid=r.peid;
    					vorname=r.vorname;
    					nachname=r.nachname;
    					gebdat=r.gebdat;
    					strasse=r.strasse;
    					plz=r.plz;
    					ort=r.ort;
    					telnr=r.telnr;
    					email=r.email;
    					jahrgang=r.jahrgang;
    					geschlecht=r.geschlecht;
    					return next; 
    				end loop; 
    		ELSE
    			for r in select * from person 
    				loop 
    					peid=r.peid;
    					vorname=r.vorname;
    					nachname=r.nachname;
    					geschlecht=r.geschlecht;
    					gebdat=null;
    					strasse=null;
    					plz=null;
    					ort=null;
    					telnr=null;
    					email=null;
    					jahrgang=null;
    					return next; 
    				end loop; 
    		END IF;
    	end;
    $BODY$
      LANGUAGE 'plpgsql' VOLATILE;
    Funktioniert.

  6. #26
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.465

    Standard

    Zitat Zitat von waldi Beitrag anzeigen
    So habe das Problem gelöst. Auf meine Weise aber es funktioniert. Ist vielleicht auch nicht ganz sauber...aber es funktioniert. Meinungen dazu interressieren mich auf jeden Fall. Besonders die von dir Akretschmer. Vielen Dank nochmal für deine Geduld.

    Also.
    Ich habe:
    1 Tabelle person in der alles steht
    1 View->Select * from person

    Es gibt 2 Gruppen die einen sind Stäbe die anderen Leiter. Leiter dürfen nicht alles von Person sehen, Stäbe aber schon.

    Stäbe bekommen Select auf Person
    Leiter nicht, aber Select auf die View

    Ja, ist okay. Man kann sowas im übrigen auch direkt in SQL machen, mit CASE ..., und damit einen VIEW erstellen. Aber letztendlich ist das egal. Hättest Du gleich das so klar beschrieben wie oben zitiert, hätte man Dir schneller helfen können.

    Andreas

    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  7. #27
    waldi ist offline Benutzer
    Registriert seit
    22.12.2006
    Beiträge
    67

    Standard

    Hi nochmal

    wollte gerade mal die Sache mit dem case testen so wie du es vor ein paar postings geschrieben hast. Ich denke das ist auch eine interressante Lösung. Mein Problem ist nur ich kann nicht mehr als eine Spalte leer anzeigen lassen. Ich hab mir in der Doku das angeschaut, aber geholfen hat es nichts. Kannst du das hier auch noch schnell posten??

  8. #28
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.465

    Standard

    Zitat Zitat von waldi Beitrag anzeigen
    Hi nochmal

    wollte gerade mal die Sache mit dem case testen so wie du es vor ein paar postings geschrieben hast. Ich denke das ist auch eine interressante Lösung. Mein Problem ist nur ich kann nicht mehr als eine Spalte leer anzeigen lassen. Ich hab mir in der Doku das angeschaut, aber geholfen hat es nichts. Kannst du das hier auch noch schnell posten??
    Ganz schnell:

    Code:
    test=*# select * from foo;
     a | b | c
    ---+---+---
     1 |   | 3
     2 | 3 | 4
     1 | 1 | 1
    (3 rows)
    
    Time: 1.381 ms
    test=*# select a, case when a =1 then 0 else b end, case when a=1 then 0 else c end from foo;
     a | b | c
    ---+---+---
     1 | 0 | 0
     2 | 3 | 4
     1 | 0 | 0
    (3 rows)
    Anstelle der Bedingung a=1 kannst Du Deine Bedingung einsetzen.

    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  9. #29
    CenText ist offline Erfahrener Benutzer
    Registriert seit
    29.07.2007
    Beiträge
    220

    Standard

    Hi, hab den Thread mal verfolgt und muss sagen wirklich interessant.

    Seh ich das richtig, dass die User dann keine Rechte auf den view oder auf die tabelle haben, sondern "nur" die funktion aufrufen "getperson"?

    Zusatzfrage: Kann ich einem Benutzer/gruppe Rechte geben eine Funktion auszuführen?

Seite 3 von 3 ErsteErste 123

Ähnliche Themen

  1. Frage Fortlaufende Tabelle/View mit Datum Einträgen
    Von vriza im Forum SQL
    Antworten: 2
    Letzter Beitrag: 07.04.2011, 16:38
  2. Antworten: 0
    Letzter Beitrag: 10.01.2011, 10:26
  3. Frage View oder Funktion
    Von GraySoft im Forum Allgemeines
    Antworten: 2
    Letzter Beitrag: 08.05.2009, 14:49
  4. Frage Tabelle als Parameter in View
    Von christophW im Forum SQL
    Antworten: 8
    Letzter Beitrag: 10.03.2009, 13:43
  5. Kein zweiter User nach Installation
    Von mgruber82 im Forum Benutzer- & Rechteverwaltung
    Antworten: 2
    Letzter Beitrag: 03.02.2007, 23:26

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Links: Tobias Bauer - IT- und Funkdienstleistungen   -   Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen   -   Funkforum