복붙노트

[SQL] 그것은 오라클의 매개 변수로 테이블 이름을 통과 할 수 있습니까?

SQL

그것은 오라클의 매개 변수로 테이블 이름을 통과 할 수 있습니까?

이 같은 저장 프로 시저를 만들려면 :

PROCEDURE P_CUSTOMER_UPDATE
  (
      pADSLTable IN Table,
      pAccountname IN NVARCHAR2,
      pStatus IN NUMBER,
      pNote IN NVARCHAR2,
      pEmail IN NVARCHAR2,
      pMobi IN NVARCHAR2,
      pServiceTypeID IN NUMBER,
      pDate IN DATE
  )
  IS
  BEGIN
      UPDATE pADSLTable
      SET STATUS = pStatus, NOTE = pNote, EMAIL = pEmail, MOBI = pMobi, SERVICETYPE_ID = pServiceTypeID, ACTIVATION_DATE = pDate
      WHERE ACCOUNT_NAME = pAccountname;
  END;

물론, 오라클은 나에게 그렇게하지 않습니다. 이 문제를 해결할 수있는 방법이 있습니까? 대단히 감사합니다.

해결법

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

    1.당신은 정확히 같은 열 이름과 데이터 유형과 여러 다른 테이블이? 닷지 디자인 냄새가.

    당신은 정확히 같은 열 이름과 데이터 유형과 여러 다른 테이블이? 닷지 디자인 냄새가.

    데이터베이스 같은 간단한 SQL에서 객체 어쨌든, 우리는 변수를 사용할 수 없습니다. 우리는 동적 SQL을 사용해야합니다.

    PROCEDURE P_CUSTOMER_UPDATE
      (
          pADSLTable IN USER_TABLES.table_name%type,
          pAccountname IN NVARCHAR2,
          pStatus IN NUMBER,
          pNote IN NVARCHAR2,
          pEmail IN NVARCHAR2,
          pMobi IN NVARCHAR2,
          pServiceTypeID IN NUMBER,
          pDate IN DATE
      )
      IS
      BEGIN
          execute immediate 
              'UPDATE '||pADSLTable
              ||' SET STATUS = :1, NOTE = :2, EMAIL = :3, MOBI = :4, SERVICETYPE_ID = :5, ACTIVATION_DATE = :6'
              ||' WHERE ACCOUNT_NAME = :7'
          using pStatus, pNote, pEmail, pMobi, pServiceTypeID, pDate, pAccountname;
      END;
    

    동적 SQL의 사용을 피하는 이유 중 하나는 남용 열려 있다는 것입니다. 악성 사람들은 우리의 보안 우회 시도하는 매개 변수를 사용할 수 있습니다. 이것은 SQL 주입이라고합니다. 나는 사람들이 이상 SQL 주입의 중요성을 추정 생각합니다. 자동으로 위협이 아니다. 예를 들어 절차는 패키지에서 개인 절차는 누군가가 그것을 공중 납치 것 같지는 않다 (즉 사양에 선언되지 않은) 경우.

    그러나 예방 조치를하는 것이 합리적이다. DBMS_ASSERT은 SQL 주입 공격을 시도 트랩에 오라클 10g에 도입 된 패키지입니다. 그것은이 전달 된 테이블 이름을 확인하는 데 사용 가치가있을 것입니다이 경우

    ....
    'UPDATE '|| DBMS_ASSERT.simple_sql_name(pADSLTable)
    ....  
    

    이것은 누구 통과 'pay_table 세트 급여 = 급여 * 10 어디 ID = 1234 -'방지 할 테이블 이름 매개 변수로.

    피하기 동적 SQL 또 다른 이유는 디버그 오른쪽 열심히 얻기 위해 열심히 것입니다. 실제 문장의 구문은 런타임에 확인됩니다. 이 절차에 구문 예외를 던지는하지 않도록 모든 전달 된 입력의 유효성을 검사 단위 테스트의 전체 제품군을 가지고하는 것이 좋다.

    마지막으로, 동적 SQL은 ALL_DEPENDENCIES으로보기에 표시되지 않습니다. 이것은 어렵게 영향 분석을 수행하고 주어진 테이블 또는 열을 사용하는 모든 프로그램을 찾을 수 있습니다.

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

    2.예, 기본 동적 SQL이 있습니다 :

    예, 기본 동적 SQL이 있습니다 :

    EXECUTE IMMEDIATE 'UPDATE ' || pADSLTable || 
      'SET STATUS = :1, NOTE = :2, EMAIL = :3, MOBI = :4, SERVICETYPE_ID = :5, ACTIVATION_DATE = :6 WHERE ACCOUNT_NAME = :7 '  
      USING pStatus, pNote, pEmail, pMobi, pServiceTypeId, pDate, pAccountname;
    

    성능 및 오류 검사는 좋은 (NO 컴파일시 구문 및 스키마 검증)으로하지 않습니다. SQL 주입 조심하십시오.

    그래서, 당신은, 대신 모든 옵션이있는 경우 / 다음 / 다른 구조를 사용하는 것을 고려 선택할 수있는 테이블의 몇이있는 경우.

  3. ==============================

    3.당신은 동적 SQL을 사용하여 DDL 문 모든 종류를 사용할 수 있습니다. 당신은 매개 변수로 다른 데이터베이스 개체의 이름을 전달하거나 변수로 조작 할 수 있습니다.

    당신은 동적 SQL을 사용하여 DDL 문 모든 종류를 사용할 수 있습니다. 당신은 매개 변수로 다른 데이터베이스 개체의 이름을 전달하거나 변수로 조작 할 수 있습니다.

  4. from https://stackoverflow.com/questions/3690038/is-it-possible-to-pass-table-name-as-a-parameter-in-oracle by cc-by-sa and MIT license