Avatar billede kronsj Nybegynder
13. oktober 2009 - 17:03 Der er 10 kommentarer og
1 løsning

create sequence i procedure

Jeg skal nulstille en sequncer i oracle 9i, og mener at det mest rigtige er at slette den og oprette den igen. Det bliver så lavet i en stored procedure på flg. måde:

CREATE OR REPLACE PROCEDURE RESTART_BOSEQ
AS
BEGIN
  EXECUTE IMMEDIATE 'DROP SEQUENCE BOSEQ';
  EXECUTE IMMEDIATE 'CREATE SEQUENCE BOSEQ START WITH 1 INCREMENT BY 1';
END;


Uden success :-(
Specielt Create Sequence driller, da oracle vidst kræver specielt grantede rettigheder til at oprette objekter inde fra en procedure.
Jeg har prøvet at lægge det ind i en package - uden success dito.
Jeg har prøvet at lægge flg kommando ind i proceduren:

GRANT CREATE SEQUENCE TO prod

- hvor prod er brugeren der skal oprette sequencen. Dette lader heller ikke helt til at virke.

Er der nogen der har en løsning på sletning og oprettelse af sequence i oracle 9

Pft
Avatar billede steber Nybegynder
13. oktober 2009 - 17:17 #1
Jeg har aldrig problemer med den slags - og umiddelbart synes jeg din proc. ser rigtig fin ud.
Kan du udføre DROP og CREATE sequence som statements, og hvilken bruger/schema er du logget på med?
Hvilken bruger/schema er din procedure gemt under?
Når du kører din proc., hvilken bruger/schema er du logget på med?
Mvh. Stefan
Avatar billede kronsj Nybegynder
14. oktober 2009 - 08:53 #2
Jeg er logget på som den samme bruger på det samme schema. Når jeg kører proceduren manuelt 2 gange får jeg flg. fejl:

FEJL i linie 1:
ORA-01031: utilstrækkelige privilegier
ORA-06512: ved "PROD.RESTART_BOSEQ", linje 5
ORA-06512: ved linje 1


BEGIN RESTART_BOSEQ; END;

*
FEJL i linie 1:
ORA-02289: sekvens findes ikke
ORA-06512: ved "PROD.RESTART_BOSEQ", linje 4
ORA-06512: ved linje 1


En pudsig ting er, at jeg har rettigheder til at slette en sequence, men har ikke rettigheder til at CREATE den samme igen fra en procedure, men kan oprette den manuelt via en sql-kommando.
Jeg vil dog stadig gerne have begge ting liggende samlet i en procedure, da det i sidste ende bliver kaldt fra et windows program.
Her testede jeg også lige om det kunne have nogen effekt at kalde den fra windows-klienten, men fik samme svar... :-(

Men (hvordan) kan jeg grante rettigheder i en procedure - hvis det altså er nødvendigt?

Ovenpå følgende diskussion, troede jeg det var et lidt pinligt spørgsmål i oracle-kredse...:
http://groups.google.dk/group/comp.databases.oracle.misc/browse_thread/thread/9b19d3de64f53b9c/3bcf077ce9aa6bb0?hl=da&ie=UTF-8&q=create+sequence+oracle+stored+procedure
Avatar billede kronsj Nybegynder
14. oktober 2009 - 08:59 #3
... lige en lille note jeg også fandt, vedr. rettigheder inde i en procedure:

"A Role is not enabled inside a Procedure .. so u need to give direct Create Seq Priv to the user who is creating the Procedure."

http://www.lazydba.com/oracle/0__71046.html

/Jørgen
Avatar billede junkmaster Nybegynder
14. oktober 2009 - 09:14 #4
Umiddelbart er jeg ikke meget for at droppe og lave objecter inde i min pl*sql kode. Nu kender jeg jo ikke din kode - men ville det ikke være bedre at resette den sequence istedet?


procedure reset_seq( p_seq_name in varchar2 )
is
    l_val number;
begin
    execute immediate
    'select ' || p_seq_name || '.nextval from dual' INTO l_val;

    execute immediate
    'alter sequence ' || p_seq_name || ' increment by -' || l_val ||
                                                          ' minvalue 0';

    execute immediate
    'select ' || p_seq_name || '.nextval from dual' INTO l_val;

    execute immediate
    'alter sequence ' || p_seq_name || ' increment by 1 minvalue 0';
end;
Avatar billede teepee Nybegynder
14. oktober 2009 - 09:29 #5
Hmm, du får jo rettigheder efter hvilket skema at proceduren restart_boseq ligger i, hvor er det? Hvis det er i prod så er det meget underligt.
Avatar billede junkmaster Nybegynder
14. oktober 2009 - 09:41 #6
CREATE USER prod IDENTIFIED BY "prod"
DEFAULT TABLESPACE "USERS"
QUOTA UNLIMITED ON "USERS";

GRANT CREATE PROCEDURE TO prod;
GRANT CREATE SEQUENCE TO prod;
GRANT CREATE SESSION TO prod;

sqlplus prod/prod

CREATE OR REPLACE PROCEDURE RESTART_BOSEQ
AS
antal number;
BEGIN
  select count(*) into antal from user_objects where object_name ='BOSEQ';
  if antal>0 then
  EXECUTE IMMEDIATE 'DROP SEQUENCE BOSEQ';
  end if;
 
  EXECUTE IMMEDIATE 'CREATE SEQUENCE BOSEQ START WITH 1 INCREMENT BY 1';
END;


begin
restart_boseq;
end;

select boseq.nextval from dual;
select boseq.nextval from dual;
select boseq.nextval from dual;

begin
restart_boseq;
end;

select boseq.nextval from dual;
select boseq.nextval from dual;
select boseq.nextval from dual;
select boseq.nextval from dual;
Avatar billede steber Nybegynder
14. oktober 2009 - 09:47 #7
Nu ved jeg jo ikke hvordan din bruger har adgang til at lave en CREATE SEQUENCE - måske fordi brugeren har DBA-rollen.
Du siger det egentlig selv - din bruger skal have CREATE SEQUENCE rollen for at din proc. kan gøre det.
Avatar billede steber Nybegynder
14. oktober 2009 - 09:49 #8
Nå, hehe. Kan se at junkmaster var inde over også ... sorry ... tror du har svaret.
Avatar billede kronsj Nybegynder
14. oktober 2009 - 11:39 #9
Hvor lang tid gælder en GRANT? er det kun indenfor det enkelte scope (eks. PROCEDURE) ?
Avatar billede junkmaster Nybegynder
14. oktober 2009 - 11:47 #10
Har du set mine kommentarer ovenfor - ellers må du forklare hvorfor du bliver ved med at forsøge med din "drop" løsning ?

   
Du kan brug AUTHID i din CREATE OR REPLACE.

Men hvis du vil have det samme privilegier som ejeren af den procedure, skal du bruge AUTHID DEFINER.

Hvis du vil have Oracle til at bruge rettighederne for den bruger d er logget ind som, skal du bruge AUTHID CURRENT_USER.

feks.

CREATE OR REPLACE PROCEDURE RESTART_BOSEQ
AUTHID CURRENT_USER IS
BEGIN
.................

Men gør det nu på den "pæne" måde og reset din sequence istedet for drop/create.
Avatar billede kronsj Nybegynder
28. oktober 2009 - 14:41 #11
NB. Troede at junkmasters forslag virkede, men umiddelbart ikke. Derefter fandt jeg flg tekst på nettet:

To restart the sequence at a different number, you must drop and re-create it.

If you change the INCREMENT BY value before the first invocation of NEXTVAL, some sequence numbers will be skipped. Therefore, if you want to retain the original START WITH value, you must drop the sequence and re-create it with the original START WITH value and the new INCREMENT BY value.

Oracle® Database SQL Reference 10g Release 1 (10.1)

http://stanford.edu/dept/itss/docs/oracle/10g/server.101/b10759/statements_2011.htm
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester