Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Czy możliwe jest przekazanie nazwy tabeli jako parametru w Oracle?

Masz kilka różnych tabel z dokładnie takimi samymi nazwami kolumn i typami danych? Pachnie jak podejrzany projekt.

W każdym razie nie możemy używać zmiennych jako obiektów bazy danych w prostym SQL w ten sposób. Musimy użyć dynamicznego 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;

Jednym z powodów unikania używania dynamicznego SQL jest to, że jest on podatny na nadużycia. Złośliwi ludzie mogą użyć parametrów, aby spróbować ominąć nasze zabezpieczenia. Nazywa się to wstrzykiwaniem SQL. Myślę, że ludzie przeceniają znaczenie iniekcji SQL. To nie jest automatycznie zagrożenie. Na przykład, jeśli procedura jest prywatną procedurą w pakiecie (tzn. nie zadeklarowaną w specyfikacji), jest mało prawdopodobne, że ktoś ją przechwyci.

Ale rozsądne jest podjęcie środków ostrożności. DBMS_ASSERT to pakiet wprowadzony w Oracle 10g do przechwytywania prób ataków typu SQL injection. W takim przypadku warto by go użyć do sprawdzenia podanej nazwy tabeli

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

Uniemożliwiłoby to każdemu przekazywanie 'pay_table set salary = salary * 10 where id = 1234 --' jako parametr nazwy tabeli.

Innym powodem unikania dynamicznego SQL jest to, że trudniej jest uzyskać poprawne i trudniejsze debugowanie. Składnia rzeczywistej instrukcji jest sprawdzana tylko w czasie wykonywania. Dobrze jest mieć pełny zestaw testów jednostkowych, które weryfikują wszystkie przekazane dane wejściowe, aby upewnić się, że procedura nie rzuca wyjątku składni.

Wreszcie, taki dynamiczny SQL nie pojawia się w widokach takich jak ALL_DEPENDENCIES. Utrudnia to przeprowadzenie analizy wpływu i zlokalizowanie wszystkich programów korzystających z danej tabeli lub kolumny.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ORA-01219:baza danych nie jest otwarta:zapytania dozwolone tylko w stałych tabelach/widokach

  2. Jak mogę wybrać rekordy TYLKO z wczoraj?

  3. Wyjaśnij plan kosztowy Punkt bólu

  4. Jak połączyć się z serwerem LDAP za pomocą node-oracledb?

  5. SQL Dev 4.2 Top SQL