Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

क्या ओरेकल में पैरामीटर के रूप में टेबल नाम पास करना संभव है?

आपके पास एक ही कॉलम नाम और डेटा प्रकार के साथ कई अलग-अलग टेबल हैं? एक डोडी डिजाइन की तरह खुशबू आ रही है।

वैसे भी, हम सीधे एसक्यूएल में डेटाबेस ऑब्जेक्ट्स के रूप में वैरिएबल का उपयोग नहीं कर सकते हैं। हमें गतिशील एसक्यूएल का उपयोग करना होगा।

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 इंजेक्शन कहा जाता है। मुझे लगता है कि लोग एसक्यूएल इंजेक्शन के महत्व का अनुमान लगाते हैं। यह स्वचालित रूप से खतरा नहीं है। उदाहरण के लिए यदि प्रक्रिया पैकेज में एक निजी प्रक्रिया है (अर्थात विनिर्देश में घोषित नहीं है) तो यह संभावना नहीं है कि कोई इसे हाईजैक कर लेगा।

लेकिन सावधानी बरतना ही समझदारी है। DBMS_ASSERT Oracle 10g में पेश किया गया एक पैकेज है जो SQL इंजेक्शन हमलों के प्रयास को फंसाने के लिए है। यह इस मामले में पारित तालिका नाम को मान्य करने के लिए इसका उपयोग करने लायक होगा

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

यह किसी को 'pay_table set salary = salary * 10 where id = 1234 --' पास करने से रोकेगा तालिका नाम पैरामीटर के रूप में।

डायनेमिक SQL से बचने का एक अन्य कारण यह है कि सही होना कठिन है और डीबग करना कठिन है। वास्तविक कथन का सिंटैक्स केवल रन टाइम पर जाँचा जाता है। यूनिट परीक्षणों का एक पूरा सूट होना अच्छा है जो सभी पारित इनपुट को मान्य करता है, यह सुनिश्चित करने के लिए कि प्रक्रिया एक वाक्यविन्यास अपवाद को प्रभावित नहीं करती है।

अंत में, ऐसी गतिशील SQL ALL_DEPENDENCIES जैसे दृश्यों में दिखाई नहीं देती है। इससे प्रभाव विश्लेषण करना और किसी दिए गए तालिका या कॉलम का उपयोग करने वाले सभी कार्यक्रमों का पता लगाना कठिन हो जाता है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL त्रुटि ORA-01722:अमान्य संख्या

  2. ओरेकल एसक्यूएल तारीख से समय कैसे निकालें

  3. कर्मचारियों के नामों को उनके शहर के कॉलम के अनुसार व्यवस्थित करने की आवश्यकता है

  4. पीएल/एसक्यूएल डेवलपर के साथ रिमोट ओरेकल डीबी से कैसे जुड़ें?

  5. मैं एक संग्रहित प्रक्रिया आउटपुट पैरामीटर कैसे प्राप्त करूं जो काम करने के लिए एक सरणी है?