복붙노트

[SQL] 저장 프로 시저 내에서 즉시 실행은 권한이 부족 오류를주고 계속

SQL

저장 프로 시저 내에서 즉시 실행은 권한이 부족 오류를주고 계속

다음은 저장 프로 시저의 정의는 다음과 같습니다

CREATE OR REPLACE PROCEDURE usp_dropTable(schema VARCHAR, tblToDrop VARCHAR) IS
BEGIN
  DECLARE v_cnt NUMBER;
  BEGIN
    SELECT COUNT(*) 
      INTO v_cnt 
      FROM all_tables 
     WHERE owner = schema
       AND table_name = tblToDrop;

     IF v_cnt > 0 THEN 
        EXECUTE IMMEDIATE('DROP TABLE someschema.some_table PURGE');
     END IF;
   END;
END;

다음 호출은 다음과 같습니다

CALL usp_dropTable('SOMESCHEMA', 'SOME_TABLE');

(가) IMMEDIATE 명령을 실행하기위한 몇 가지 이유를 들어, 내가있는 권한 오류가 계속. 나는 온라인으로보고하고있는 권한 오류가 일반적으로 오라클 사용자 계정이 경우 DROP이다 패스이며, 그 쿼리에 사용되는 명령에 대한 권한이없는 것을 의미 것을 알아 냈다. 그러나, 나는 드롭 권한을 갖습니다. 정말 혼란 스러워요 그리고 나를 위해 작동하는 솔루션을 찾을 수 없습니다.

사전에 감사합니다.

해결책:

스티브 아래에 언급 한 바와 같이 명시 적으로 어딘가 종류의 권한으로 사용하는 어떤 과정에서 알아야 할 필요가 있다는 점에서 오라클의 보안 모델은 이상하다. 오라클은이를 알려하는 방법은 AUTHID 키워드는 CREATE OR REPLACE 문에 사용하는 것입니다. 프로 시저의 창조자로서 권한의 동일한 수준을 원한다면, 당신은 AUTHID DEFINER를 사용합니다. 오라클은 현재 저장 프로 시저를 실행하는 사용자의 권한을 사용하려면, 당신은 AUTHID CURRENT_USER를 사용하고 싶습니다. 다음과 같이 프로 시저 선언 본다 :

CREATE OR REPLACE PROCEDURE usp_dropTable(schema VARCHAR, tblToDrop VARCHAR) 
AUTHID CURRENT_USER IS
BEGIN
  DECLARE v_cnt NUMBER;
  BEGIN
    SELECT COUNT(*) 
      INTO v_cnt 
      FROM all_tables 
     WHERE owner = schema
       AND table_name = tblToDrop;

     IF v_cnt > 0 THEN 
        EXECUTE IMMEDIATE('DROP TABLE someschema.some_table PURGE');
     END IF;
   END;
END;

응답 당신에게 모두 감사드립니다. 이 솔루션에 도착 확실히 매우 성가신 문제였다.

해결법

  1. ==============================

    1.오라클의 보안 모델은 즉시 실행하여 동적 SQL을 실행할 때 (A PL / SQL 블록 또는 절차의 맥락 내에서), 사용자가 역할 구성원을 통해 부여 된 개체 또는 명령에 대한 권한을 가지고 있지 않도록합니다. 사용자는 것 "DBA"역할 또는 유사한 무언가가있다. 당신은 명시 적으로 사용자에게 "드롭 테이블"권한을 부여해야합니다. (예 : SYS 또는 시스템)를 다른 스키마의 테이블에서 선택하려고 한 경우에도 동일 적용됩니다 - 당신이 사용자에게 해당 테이블에 명시 적 SELECT 권한을 부여해야합니다.

    오라클의 보안 모델은 즉시 실행하여 동적 SQL을 실행할 때 (A PL / SQL 블록 또는 절차의 맥락 내에서), 사용자가 역할 구성원을 통해 부여 된 개체 또는 명령에 대한 권한을 가지고 있지 않도록합니다. 사용자는 것 "DBA"역할 또는 유사한 무언가가있다. 당신은 명시 적으로 사용자에게 "드롭 테이블"권한을 부여해야합니다. (예 : SYS 또는 시스템)를 다른 스키마의 테이블에서 선택하려고 한 경우에도 동일 적용됩니다 - 당신이 사용자에게 해당 테이블에 명시 적 SELECT 권한을 부여해야합니다.

  2. ==============================

    2.당신은 AUTHID CURRENT_USER이 예제를 사용한다 :

    당신은 AUTHID CURRENT_USER이 예제를 사용한다 :

    CREATE OR REPLACE PROCEDURE Create_sequence_for_tab (VAR_TAB_NAME IN VARCHAR2)
       AUTHID CURRENT_USER
    IS
       SEQ_NAME       VARCHAR2 (100);
       FINAL_QUERY    VARCHAR2 (100);
       COUNT_NUMBER   NUMBER := 0;
       cur_id         NUMBER;
    BEGIN
       SEQ_NAME := 'SEQ_' || VAR_TAB_NAME;
    
       SELECT COUNT (*)
         INTO COUNT_NUMBER
         FROM USER_SEQUENCES
        WHERE SEQUENCE_NAME = SEQ_NAME;
    
       DBMS_OUTPUT.PUT_LINE (SEQ_NAME || '>' || COUNT_NUMBER);
    
       IF COUNT_NUMBER = 0
       THEN
          --DBMS_OUTPUT.PUT_LINE('DROP SEQUENCE ' || SEQ_NAME);
          -- EXECUTE IMMEDIATE 'DROP SEQUENCE ' || SEQ_NAME;
          -- ELSE
          SELECT 'CREATE SEQUENCE COMPTABILITE.' || SEQ_NAME || ' START WITH ' || ROUND (DBMS_RANDOM.VALUE (100000000000, 999999999999), 0) || ' INCREMENT BY 1'
            INTO FINAL_QUERY
            FROM DUAL;
    
          DBMS_OUTPUT.PUT_LINE (FINAL_QUERY);
          cur_id := DBMS_SQL.OPEN_CURSOR;
          DBMS_SQL.parse (cur_id, FINAL_QUERY, DBMS_SQL.v7);
          DBMS_SQL.CLOSE_CURSOR (cur_id);
       -- EXECUTE IMMEDIATE FINAL_QUERY;
    
       END IF;
    
       COMMIT;
    END;
    /
    
  3. ==============================

    3.당신은 당신의 요구 사항은 프로 시저 정의의 본문에 "AUTHID CURRENT_USER"를 사용할 수 있습니다.

    당신은 당신의 요구 사항은 프로 시저 정의의 본문에 "AUTHID CURRENT_USER"를 사용할 수 있습니다.

  4. ==============================

    4.수하고 실행 절차에 어떤 변화가 필요없이 필요하다면 다른 방법은 사용자 DROP_ANY_TABLE 권한을 부여 할 수 있습니다. 어쩌면 위험하지만 당신이 무슨 일을하는지 따라 달라집니다 :)

    수하고 실행 절차에 어떤 변화가 필요없이 필요하다면 다른 방법은 사용자 DROP_ANY_TABLE 권한을 부여 할 수 있습니다. 어쩌면 위험하지만 당신이 무슨 일을하는지 따라 달라집니다 :)

  5. from https://stackoverflow.com/questions/996198/execute-immediate-within-a-stored-procedure-keeps-giving-insufficient-priviliges by cc-by-sa and MIT license