No Oracle, por que current_timestamp, por vezes, o tempo de retorno do servidor, outras vezes GMT?
Pergunta
Eu tenho um aplicativo Java em execução contra o banco de dados de um Oracle 9i. A base de dados tem um gatilho para criar um registo de auditoria, que controla as alterações para o registo de base. O gatilho utiliza current_timestamp. Quando eu modificar o registro base com o aplicativo Java, o registro de auditoria reflete GMT. No entanto, se eu usar Toad e atualizar o registro base, o registro de auditoria reflete horário do servidor (que é definido para hora local). Consultando CURRENT_TIMESTAMP retorna horário do servidor. Eu não consigo encontrar o que faz a diferença. Todas as idéias lá fora?
Solução
Os valores dos parâmetros NLS pode ser definida dentro de uma sessão (às vezes em um gatilho login), herdado do ambiente OS, ou set na inicialização da instância, o que torna a rastreá-los um pouco complicado.
A seguir mostra consulta divergência do banco de dados, e se você pode obter esta saída de seus dois ambientes divergentes, que podem ajudar:
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
Quando eu corria que em um Windows SQL * Plus, eu não tenho linhas retornadas, por isso não havia diferenças entre meu ambiente de aplicativos e ali padrões de banco de dados. No entanto, quando eu corri de um ambiente 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