sql >> Database >  >> RDS >> Oracle

Is het mogelijk om de tabelnaam als parameter in Oracle door te geven?

U hebt verschillende tabellen met exact dezelfde kolomnamen en gegevenstypen? Ruikt naar een onbetrouwbaar ontwerp.

Hoe dan ook, we kunnen geen variabelen gebruiken als database-objecten in dergelijke eenvoudige SQL. We moeten dynamische SQL gebruiken.

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;

Een reden om het gebruik van dynamische SQL te vermijden, is dat het vatbaar is voor misbruik. Kwaadwillenden kunnen de parameters gebruiken om te proberen onze beveiliging te omzeilen. Dit wordt SQL-injectie genoemd. Ik denk dat mensen het belang van SQL-injectie overschatten. Het is niet automatisch een bedreiging. Als de procedure bijvoorbeeld een privéprocedure in een pakket is (d.w.z. niet aangegeven in de specificatie), is het onwaarschijnlijk dat iemand deze zal kapen.

Maar het is verstandig om voorzorgsmaatregelen te nemen. DBMS_ASSERT is een pakket dat in Oracle 10g is geïntroduceerd om pogingen tot SQL-injectieaanvallen te onderscheppen. In dit geval zou het de moeite waard zijn om het te gebruiken om de doorgegeven tabelnaam te valideren

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

Dit zou voorkomen dat iemand 'pay_table set salary = salary * 10 where id = 1234 --' doorgaat als de tabelnaamparameter.

Een andere reden om dynamische SQL te vermijden, is dat het moeilijker is om het goed te doen en moeilijker te debuggen. De syntaxis van de eigenlijke instructie wordt alleen tijdens runtime gecontroleerd. Het is goed om een ​​complete reeks eenheidstests te hebben die alle doorgegeven invoer valideren, om ervoor te zorgen dat de procedure geen syntaxisuitzondering veroorzaakt.

Ten slotte wordt zo'n dynamische SQL niet weergegeven in weergaven zoals ALL_DEPENDENCIES. Dit maakt het moeilijker om een ​​impactanalyse uit te voeren en alle programma's te lokaliseren die een bepaalde tabel of kolom gebruiken.



  1. PHP 5-applicaties uitvoeren met MySQL 8.0 op CentOS 7

  2. Hoe kan ik meerdere rijen combineren in een door komma's gescheiden lijst in SQL Server 2005?

  3. In PostgreSQL, hoe gegevens in te voegen met de opdracht COPY?

  4. Entity Developer en ADO.Net Data Providers ondersteunen nu Entity Framework Core 5