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

Er det muligt at sende tabelnavn som en parameter i Oracle?

Har du flere forskellige tabeller med nøjagtig de samme kolonnenavne og datatyper? Lugter som et risikable design.

Vi kan i hvert fald ikke bruge variabler som databaseobjekter i ligefrem SQL på den måde. Vi skal bruge dynamisk 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;
 

En grund til at undgå brugen af ​​dynamisk SQL er, at den er åben for misbrug. Ondsindede personer kan bruge parametrene til at forsøge at omgå vores sikkerhed. Dette kaldes SQL-injektion. Jeg tror, ​​at folk overvurderer betydningen af ​​SQL-injektion. Det er ikke automatisk en trussel. Hvis proceduren for eksempel er en privat procedure i en pakke (dvs. ikke erklæret i specifikationen), er det usandsynligt, at nogen vil kapre den.

Men det er fornuftigt at tage forholdsregler. DBMS_ASSERT er en pakke introduceret i Oracle 10g til at fange forsøg på SQL-injektionsangreb. I dette tilfælde ville det være værd at bruge det til at validere det beståede tabelnavn

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

Dette ville forhindre, at nogen passerer 'pay_table set salary = salary * 10 where id = 1234 --' som parameteren tabelnavn.

En anden grund til at undgå dynamisk SQL er, at det er sværere at få ret og sværere at fejlfinde. Syntaksen for den faktiske sætning kontrolleres kun ved kørsel. Det er godt at have en komplet pakke af enhedstests, som validerer alle de beståede input, for at sikre, at proceduren ikke udløser en syntaksundtagelse.

Endelig vises en sådan dynamisk SQL ikke i visninger såsom ALL_DEPENDENCIES. Dette gør det sværere at foretage en konsekvensanalyse og finde alle de programmer, der bruger en given tabel eller kolonne.



  1. Find overlappende datointervaller i PostgreSQL

  2. Oprettelse af en trigger til kun at køre, når en ny tabel oprettes

  3. SQLite introducerer UNIXEPOCH()-funktionen

  4. Sådan installeres phpMyAdmin