Oracle
 sql >> Database >  >> RDS >> Oracle

È possibile passare il nome della tabella come parametro in Oracle?

Hai diverse tabelle con esattamente gli stessi nomi di colonna e tipi di dati? Ha l'odore di un disegno ambiguo.

Ad ogni modo, non possiamo usare variabili come oggetti di database in SQL semplice come quello. Dobbiamo usare SQL dinamico.

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;

Uno dei motivi per evitare l'uso di SQL dinamico è che è soggetto ad abusi. Le persone malintenzionate possono utilizzare i parametri per tentare di aggirare la nostra sicurezza. Questo è chiamato SQL injection. Penso che le persone sopravvalutano il significato di SQL injection. Non è automaticamente una minaccia. Ad esempio, se la procedura è una procedura privata in un pacchetto (cioè non dichiarata nelle specifiche) è improbabile che qualcuno la dirotti.

Ma è sensato prendere precauzioni. DBMS_ASSERT è un pacchetto introdotto in Oracle 10g per intercettare i tentativi di attacco SQL injection. In questo caso varrebbe la pena utilizzarlo per convalidare il nome della tabella passato

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

Ciò impedirebbe a chiunque di passare 'pay_table set salary = salary * 10 where id = 1234 --' come parametro del nome della tabella.

Un altro motivo per evitare l'SQL dinamico è che è più difficile correggere e eseguire il debug. La sintassi dell'istruzione effettiva viene verificata solo in fase di esecuzione. È bene avere una suite completa di unit test che convalidano tutti gli input passati, per garantire che la procedura non generi un'eccezione di sintassi.

Infine, tale SQL dinamico non viene visualizzato in viste come ALL_DEPENDENCIES. Ciò rende più difficile eseguire l'analisi dell'impatto e individuare tutti i programmi che utilizzano una determinata tabella o colonna.