Pular para o conteúdo

Fóruns SQL e PL/SQL Criação de tabela via PL/SQL Criação de tabela via PL/SQL

#92033
fsitja
Participante

    Dar um grant create any table é muito perigoso na minha opinião, e não vai resolver o erro. Como já mencionado pelo rwarstat, procedures rodam com DEFINER’s Rights como padrão.

    Para fazer o que você quer você teria que criar a procedure com INVOKER’s rights para que o chamador dela tenha seus privilégios verificados na hora de realizar o procedimento. Com esse tipo de operação ninguém quer um usuário correndo por aí executando uma procedure com super-privilégios.

    Ainda assim é uma solução deselegante e vulnerável a SQL injection. Criar tabelas em tempo de execução é algo que vai de encontro às boas práticas. O ideal seria reavaliar a necessidade.
    Existem global temporary tables que podem ser usadas ou external tables, nested tables em programa, etc.

    http://download.oracle.com/docs/cd/E118 … ADMIN11633

    Além disso, do ponto de vista de controle de transações, o DDL dinâmico vai disparar um commit implícito em qualquer coisa que o usuário tenha feito até aquele momento, podendo causar dores de cabeça razoáveis para você mais tarde. Ou você opta por dar um rollback preventivo para evitar bagunçar o BD ou você arca com as consequências de um commit indesejado…

    Se você realmente quiser levar a cabo isso, mais tarde eu posto em detalhes em casa onde tenho um SYSDBA para brincar. Aqui não tenho esse poder de fogo todo.

    Segue abaixo referência para um self-study:
    http://www.oracle.com/pls/db112/to_URL? … LNPLS00809
    http://download.oracle.com/docs/cd/E118 … m#BABFJEGJ

    Quando der, informe sua versão do Oracle por gentileza, pois tem algumas particularidades que podem ser úteis (DBMS_ASSERT no 11g e por aí vai).

    Segue abaixo também um excelente artigo sobre SQL injection:
    http://www.oracle.com/technology/oramag … sktom.html

    []’s
    Francisco.