2009-12-10 14 views
12

उद्देश्य वेब एप्लिकेशन से वर्तमान उपयोगकर्ता आईडी जैसे ट्रिगर्स को अतिरिक्त जानकारी भेजना है। चूंकि कनेक्शन पूल का उपयोग किया जाता है, और उसी उपयोगकर्ता आईडी का उपयोग सभी कनेक्शनों के लिए किया जाता है, मैं मूल वेब उपयोगकर्ता आईडी को ट्रिगर करने के लिए कैसे पास करूं? यह मुझे आवेदन कोड छूए बिना लागू करने की जरूरत है। यह एक जावा आधारित आवेदन है।ओरेकल ट्रिगर में मनमानी पैरामीटर कैसे भेजें?

जॉन

उत्तर

1

आप एक पैकेज का उपयोग कर सकते वेब उपयोगकर्ता का ट्रैक रखने के: किसी भी DML या अन्य पैकेज कॉल प्रदर्शन से पहले

create package web_user_pkg is 

    procedure set_username (p_username varchar2); 

    function username return varchar2; 

end; 

create package body web_user_pkg is 

    g_username varchar2(30); 

    procedure set_username (p_username varchar2) 
    is 
    begin 
     g_username := p_username; 
    end; 

    function username return varchar2 is 
    begin 
     return g_username; 
    end; 

end; 

वर्तमान उपयोगकर्ता के आईडी के साथ वेब पेज कॉल web_user_pkg.set_username में ।

ट्रिगर में वेब उपयोगकर्ता नाम प्राप्त करने के लिए web_user_pkg.username का उपयोग करें।

+0

एक अच्छा समाधान लगता है। क्या यह पैकेज वैरिएबल अन्य कनेक्शन के बीच साझा किया गया है? –

+0

नहीं, यह कनेक्शन के लिए अद्वितीय है। कनेक्शन पूलिंग अनुपयोगी होगी यदि अलग-अलग अंत उपयोगकर्ता एक ही डेटाबेस स्थिति साझा कर रहे थे! –

+1

बस स्पष्ट करने के लिए, यदि 10 डेटाबेस सत्र हैं, तो अधिकतम 10 समवर्ती डेटाबेस राज्य हैं, भले ही आपके पास 50 एप्लिकेशन अंतिम उपयोगकर्ता हों। कनेक्शन डेटाबेस का बिंदु उन डेटाबेस सत्रों को साझा करना है। आवेदन लेनदेन की अवधि के लिए एक कनेक्शन/सत्र ले जाएगा। यह उसी आवेदन अंत उपयोगकर्ता द्वारा बाद के लेनदेन के लिए एक ही कनेक्शन का उपयोग नहीं करेगा। –

15

आप किसी उपयोगकर्ता को ट्रिगर में पास करने के लिए क्लाइंट_identifier सत्र चर का उपयोग कर सकते हैं।

CALL dbms_session.set_identifier('<<username>>'); 

और ट्रिगर के अंदर इसे पुनः प्राप्त:

SELECT sys_context('USERENV','CLIENT_IDENTIFIER') INTO username FROM DUAL; 

अधिक जानकारी Oracle docs

+0

+1 ऐसा करने के लिए यह "सही" तरीका प्रतीत होता है! –

+0

यह काम करता है यदि आपको ट्रिगर में अपेक्षाकृत सामान्य विशेषताओं में से कुछ को पास करने की आवश्यकता है। संदर्भों का उपयोग करने के विन्सेंट का दृष्टिकोण, हालांकि, मनमाना मानकों को पारित करने की अनुमति देता है। –

+4

धन्यवाद, जब मैं अटक गया था तो बहुत मदद की! बस उल्लेख करना चाहते हैं, पहली कोड लाइन में ऑल-कैप्स में 'USERNAME' शब्द का उपयोग थोड़ा उलझन में है। ऐसा लगता है कि इसका शाब्दिक रूप से लिया जाना है, लेकिन वास्तव में, यह लॉग-इन ऐप उपयोगकर्ता की उपयोगकर्ता आईडी के लिए एक स्टैंड-इन है जिसे आप ट्रिगर पर भेजना चाहते हैं। हालांकि दूसरी कोड लाइन शाब्दिक होने के लिए है, मान लीजिए कि आप 'उपयोगकर्ता नाम' को लॉग-इन ऐप उपयोगकर्ता की उपयोगकर्ता आईडी धारण करने वाले चर होना चाहते हैं। –

8

आप इस्तेमाल कर सकते हैं में पाया जा सकता

यह सेट इस तरह डेटाबेस से कनेक्ट करने के बाद ओरेकल Contexts:

SQL> CREATE OR REPLACE PACKAGE test_pkg AS 
    2  PROCEDURE set_context(p_attribute VARCHAR2, p_value VARCHAR2); 
    3 END test_pkg; 
    4/

Package created 
SQL> CREATE OR REPLACE PACKAGE BODY test_pkg AS 
    2  PROCEDURE set_context(p_attribute VARCHAR2, p_value VARCHAR2) IS 
    3  BEGIN 
    4  dbms_session.set_context('test_ctx', p_attribute, p_value); 
    5  END; 
    6 END test_pkg; 
    7/

Package body created 

SQL> create context test_ctx using test_pkg; 

Context created 

SQL> exec test_pkg.set_context ('user_id', 'Vincent'); 

PL/SQL procedure successfully completed 

SQL> select sys_context('test_ctx', 'user_id') from dual; 

SYS_CONTEXT('TEST_CTX','USER_I 
-------------------------------------------------------------------------------- 
Vincent 
संबंधित मुद्दे