في Oracle، لماذا يقوم Current_timestamp في بعض الأحيان بإرجاع وقت الخادم، وأوقات أخرى بتوقيت جرينتش؟
سؤال
لدي تطبيق Java يعمل مقابل قاعدة بيانات Oracle 9i. تحتوي قاعدة البيانات على الزناد لإنشاء سجل تدقيق، والذي يتسابق التغييرات في السجل الأساسي. يستخدمن الزناد current_timestamp. عندما أقوم بتعديل السجل الأساسي بتطبيق Java، يعكس سجل التدقيق بتوقيت جرينتش. ومع ذلك، إذا كنت تستخدم الضفدع وتحديث السجل الأساسي، فإن سجل التدقيق يعكس وقت الخادم (الذي تم ضبطه على التوقيت المحلي). استعلام Current_timestamp إرجاع وقت الخادم. لا أستطيع أن أجد ما يسبب الفرق. أي أفكار هناك؟
المحلول
يمكن تعيين قيم المعلمات NLS في غضون جلسة (في بعض الأحيان في مشغل تسجيل الدخول)، موروثة من بيئة نظام التشغيل، أو تعيين عند بدء تشغيل المثيل، مما يجعلها تتبعها صعبة بعض الشيء.
يعرض الاستعلام التالي اختلافا من قاعدة البيانات، وإذا كان بإمكانك الحصول على هذا الإخراج من بيئتي المتباينة الخاصة بك، فقد يساعد ذلك:
SELECT * FROM
(
SELECT PARAMETER,
VALUE AS SESSION_VALUE,
(SELECT VALUE FROM NLS_INSTANCE_PARAMETERS NIP
WHERE NIP.PARAMETER = NSP.PARAMETER) INSTANCE_VALUE,
(SELECT VALUE FROM NLS_DATABASE_PARAMETERS NDP
WHERE NDP.PARAMETER = NSP.PARAMETER) DATABASE_VALUE
FROM NLS_SESSION_PARAMETERS NSP
)
WHERE NVL(INSTANCE_VALUE, DATABASE_VALUE) <> DATABASE_VALUE
OR NVL(SESSION_VALUE, NVL(INSTANCE_VALUE, DATABASE_VALUE)) <> DATABASE_VALUE
عندما أدارت إلى أنه على نظام التشغيل Windows SQL * Plus، لم أحصل على صفقات، لذلك لم تكن هناك اختلافات بين بيئة التطبيق الخاصة بي وهناك افتراضيات قاعدة البيانات. ومع ذلك، عندما ركضت من بيئة UNIX:
PARAMETER SESSION_VALUE INSTANCE_VALUE DATABASE_VALUE
------------------------- ------------------------- ------------------------- -------------------------
NLS_DATE_FORMAT YYYY-MM-DD HH24:MI:SS DD-MON-RR
NLS_TIMESTAMP_TZ_FORMAT YYYY-MM-DD HH24:MI:SS.FF DD-MON-RR HH.MI.SSXFF AM
TZH:TZM TZR