domingo, 17 de septiembre de 2023

ORA-28001: The password has expired

ORA-28001: The password has expired

Hola.

Estoy obteniendo el error ORA-28001: The password has expired en una base de datos Oracle 19c. 

Esto provoca que las aplicaciones estén enviando errores al momento de conectarse a la base de datos usando estos usuarios. Los usuarios no están bloqueados pero se muestran como EXPIRED.

Para conocer el estatus de los usuarios se puede utilizar el siguiente query:

SELECT username, account_status, expiry_date FROM dba_users;

Importante mencionar que el error ORA-28001 es consecuencia de ignorar el error ORA-28002: the password will expire in 7 days 😅. Este error aparece primero y es una advertencia para actualizar el password del usuario en cuestión. Durante este tiempo la cuenta se pone en estado de EXPIRED(GRACE) indicando que el password debe ser actualizado.

ORA-28002: the password will expire in 7 days

Solución

Ls solución es actualizar el password del o los usuarios en cuestión. Preferentemente desde el momento de la advertencia pero también funciona cuando la contraseña ya expiró como en mi caso.

Ejecutar la siguiente instrucción para setear el password del usuario. 

La contraseña puede ser la misma, no necesariamente una nueva. Esto para evitar problemas con las aplicaciones. 

sqlplus / as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on Sun Sep 17 15:39:43 2023
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0

SQL> ALTER USER myuser IDENTIFIED BY my password;
User altered.

SQL> ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;
Profile altered.

SQL> commit;

SQL> exit;

Muy importante ejecutar la instrucción commit para aplicar el cambio de profile.

Espero les sirva.


domingo, 23 de julio de 2023

El trabajo "SYSTEM"."SYS_IMPORT_FULL" se ha parado debido a un error fatal

El trabajo "SYSTEM"."SYS_IMPORT_FULL" se ha parado debido a un error fatal

Hola.

Estoy obteniendo el siguiente error al intentar importar una base de datos Oracle 19c con la utilidad impdp

Importante mencionar que estoy haciendo un full import por lo que es requisito que todos los tablespaces de la base de datos fuente existan en la base de datos destino.

Oracle-impdp-SYSTEM-SYS_IMPORT_FULL

C:\WINDOWS\system32>impdp FULL=y DUMPFILE=230710EXPDAT.DMP LOGFILE=full_log_import.log
Import: Release 19.0.0.0.0 - Production on Dom Jul 23 14:07:20 2023
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle and/or its affiliates. All rights reserved.

Usuario: system
Contrase±a:

Conectado a: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production

La tabla maestra "SYSTEM"."SYS_IMPORT_FULL_05" se ha cargado/descargado correctamente
Iniciando "SYSTEM"."SYS_IMPORT_FULL_05": system/******** FULL=y DUMPFILE=230710EXPDAT.DMP LOGFILE=full_log_import.log
Procesando el tipo de objeto DATABASE_EXPORT/PRE_SYSTEM_IMPCALLOUT/MARKER
Procesando el tipo de objeto DATABASE_EXPORT/PRE_INSTANCE_IMPCALLOUT/MARKER
Procesando el tipo de objeto DATABASE_EXPORT/TABLESPACE
ORA-39014: Uno o mßs trabajos han salido antes de tiempo.
ORA-39029: el trabajo 1 con el nombre de proceso "DW00" ha terminado antes de tiempo
ORA-39014: Uno o mßs trabajos han salido antes de tiempo.
ORA-39029: el trabajo 2 con el nombre de proceso "DW00" ha terminado antes de tiempo
El trabajo "SYSTEM"."SYS_IMPORT_FULL_05" se ha parado debido a un error fatal en Dom Jul 23 14:10:40 2023 elapsed 0 00:03:00


Solución

Primero hay que revisar el alert log para tener mas información acerca del error.

El alert log se encuentra en una ruta similar a esta (BACKGROUND_DUMP_DEST): F:\app\oracle\diag\rdbms\{dbname}\{sid}\trace\alert_{dbname}.log

Al analizar el contenido del alert log encuentro el siguiente error:

2023-07-23T14:07:56.542039-04:00
Exception [type: INT_DIVIDE_BY_ZERO, ] [] [PC:0x7FFCCA342CE2, skgfrcre()+450]
Errors in file F:\APP\ORACLE\diag\rdbms\cmsdrdb\cmsdrdb\trace\cmsdrdb_dw00_8884.trc (incident=15825):
ORA-07445: se ha encontrado una excepción: volcado de memoria [skgfrcre()+450] [INT_DIVIDE_BY_ZERO] [] [PC:0x7FFCCA342CE2] [] []
Incident details in: F:\APP\ORACLE\diag\rdbms\cmsdrdb\cmsdrdb\incident\incdir_15825\cmsdrdb_dw00_8884_i15825.trc
Use ADRCI or Support Workbench to package the incident.
See Note 411.1 at My Oracle Support for error and packaging details.

El error se encuentra justo después de un comando CREATE TABLESPACE. Este tablespace no estaba creado en la base de datos destino por lo que no puede encontrarlo. 

Con esta información verifico que todos los tablespaces de la base de datos fuente existan en la base de datos destino. La ubicación de los datafiles puede ser diferente pero los tablespaces deben existir con el mismo nombre. Esto es un requisito para un full import.

SQL> select name from v$tablespace;

Después de crear el tablespace faltante, repito la instrucción de import impdp y finalmente puedo importar la base de datos.

El trabajo "SYSTEM"."SYS_IMPORT_FULL_06" ha terminado con 14 error(es) en Dom Jul 23 14:52:37 2023 elapsed 0 00:07:18

Espero les sirva.

jueves, 13 de julio de 2023

ORA-12154: TNS:no se ha podido resolver el identificador de conexión especificado

ORA-12154: TNS:no se ha podido resolver el identificador de conexión especificado 

Hola.

Estoy teniendo el siguiente error al intentar importar un backup de base de datos de Oracle 19c con el comando impdp justo después la creación de una nueva base de datos.

C:\WINDOWS\system32>impdp system/pwd@myhost:1521/MYINSTANCE FULL=y DUMPFILE=FILEEXPDAT.DMP LOGFILE=full_log_import.log

Import: Release 19.0.0.0.0 - Production on MiÚ Jul 12 19:58:41 2023

Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.

UDI-12154: la operación ha generado un error ORACLE 12154

ORA-12154: TNS:no se ha podido resolver el identificador de conexión especificado

El error es un tanto genérico porque no ofrece mucha información y las causas pueden ser diversas. 

En mi caso particular es importante mencionar que la base de datos está recién creada y este comportamiento ya lo he experimentado con una base de datos nueva.

Solución

  • Verificar que existe el archivo tnsnames.ora en la siguiente ubicación: $ORACLE_HOME/network/admin/tnsnames.ora

Si no existe el archivo, crearlo manualmente y generar una entrada con la descripción del servicio en el siguiente formato:

MYSERVICE =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = DESKTOP-1KG2CLC)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = MYSERVICE)
)
)

  • En la misma ubicación, verificar que el archivo sqlnet.ora contenga TNSNAMES en el parámetro NAMES.DIRECTORY_PATH

NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)

  • En este punto verificar si la aplicación ya reconoce el servicio y puede conectarse.
Se puede verificar que el servicio responde usando la utilidad tnsping

$ORACLE_HOME\bin>tnsping MYSERVICE
  • En este y otros casos es importante que el listener esté prendido cuando se inicia la base de datos para que reconozca la instancia de Oracle.  

Lo primero que hay que revisar es que el listener esté activo y que tenga comunicación con la instancia/servicio de Oracle. Para esto ejecutar la siguiente instrucción en un command prompt:

C:\WINDOWS\system32>lsnrctl status

LSNRCTL for 64-bit Windows: Version 19.0.0.0.0 - Production on 12-JUL-2023 19:57:24

Copyright (c) 1991, 2019, Oracle.  All rights reserved.

Conectßndose a (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))

TNS-12541: TNS:no hay ningún listener

 TNS-12560: TNS:error del adaptador de protocolo

  TNS-00511: No hay ningún listener

   64-bit Windows Error: 61: Unknown error

Como se ve en este caso, el estatus del listener está apagado por lo que hay que prenderlo pero debe ser en el siguiente orden que incluye reiniciar la base de datos.

1.- En otro command prompt conectarse a la base de datos y apagarla con el comando: shutdown immediate

Oracle shutdown immediate

2.- En el otro command prompt prender el listener con el comando: lsnrctl start

oracle listener lsnrctl start

*Si es necesario se puede usar también el comando: lsnrctl stop

3.- En el command prompt de la base de datos, iniciar la base de datos con el comando: startup

oracle startup command

Al iniciarse la base de datos, el listener la va a reconocer y reportar como un servicio disponible.

4.- Por último, verificar el estatus del listener con el comando: lsnrctl status

lsnrctl status command

Con este orden de reinicio pude corregir el error inicial que tenía.

Espero les sirva.


viernes, 7 de julio de 2023

PostgreSQL ERROR: relation “table” does not exist 42P01

PostgreSQL ERROR: relation “table” does not exist 42P01 


Hola.

PostgreSQL está devolviendo el siguiente error al ejecutar un stored procedure que utiliza diversas tablas dentro de una base de datos.

SQL Exception occurred (SQL STATE = 42P01) - detailMessage - ERROR: relation “table” does not exist

PostgreSQL ERROR: relation “table” does not exist



Importante mencionar que el stored es reconocido y ejecutado sin problemas pero las tablas que se utilizan dentro provocan el error al momento de ejecución. 

El stored está firmado con el nombre del esquema pero las tablas no tienen la firma del esquema.

Solución.

La línea de conexión a la base de datos tanto en pgAdmin como en la aplicación están usando el parámetro currentSchema con el nombre del esquema de las tablas y es aquí donde se encontraba el problema.

jdbc:postgresql://dev-host.com:5432/dev_db?currentSchema=myschema

En la línea de conexión, el parámetro currentSchema debe estar en camel case format para que el esquema sea reconocido en la conexión y por lo tanto las tablas del esquema también lo sean.


Espero les sirva.


domingo, 21 de mayo de 2023

Ver errores descriptivos de ASP clásico en navegador con IIS 10

Cómo ver errores descriptivos de ASP clásico en navegador con IIS 10 

Hola.

Enviar los errores de ejecución a navegador no están habilitados por default en IIS 10 por lo que se tienen que activar manualmente.

El error genérico que se ve en un navegador cuando hay un error de ejecución de código ASP classic es el siguiente: 

An error occurred on the server when processing the URL. Please contact the system administrator.

If you are the system administrator please click here to find out more about this error.

Este error no es descriptivo y no ayuda en nada para debuguear algún problema con el código por lo que hay que hacer lo siguiente para ver el error descriptivo.

Esta solución asume que ya han instalado la opción de ASP clásico desde Add or remove Windows Features.

Solución.

1.- Ir al sitio desde IIS manager

2.- Seleccionar el icono de ASP

3.- Expandir Debug Properties y cambiar la opción Send Errors to Browser a true

IIS 10 - Send Errors to Browser a true

Después de esto hay que volver a refrescar la dirección para ver el error.

Espero les sirva.

martes, 11 de abril de 2023

Oracle out parameter se trunca a la mitad

Oracle out parameter se trunca a la mitad de caracteres

Hola.

Estoy teniendo un problema en la llamada a un stored procedure de Oracle 19c

El problema consiste en que tengo definido un parámetro de salida de tipo VARCHAR2 en el stored procedure que al ser ejecutado devuelve el campo pero lo corta a la mitad de caracteres.

Ejemplo:

"hola_mundo" -> "hola_" 

Esto está ocasionando problemas de funcionamiento porque el valor completo es requerido para la autenticación de la aplicación. 

La versión de base de datos que estoy usando es Oracle 19c en Windows Server y la aplicación web es ASP.NET 4.8 con C# 

Es importante mencionar que tanto la versión de .NET como la versión de base de datos están siendo actualizadas. Anteriormente la versión .NET era 4.0 y la versión de Oracle era 11g.

Solución.


La solución de este problema es cambiar el tipo del parámetro de salida de VARCHAR2 a CHAR.

PROCEDURE SP_LGN_WS(p_status OUT NUMBER, p_roles OUT VARCHAR2)

Cambiar por:

PROCEDURE SP_LGN_WS(p_status OUT NUMBER, p_roles OUT CHAR)

Con este cambio el parámetro de salida devuelve el campo completo.

*Otro de los problemas que existen es que la aplicación usa la siguiente librería obsoleta: System.Data.Oracle.Client
La cual ya no es recomendada para trabajar con Oracle. 


Espero les sirva.

martes, 7 de marzo de 2023

DelegatingCallableStatement cannot be cast to class OracleCallableStatement

java.lang.ClassCastException 


Hola.

Estoy obteniendo el siguiente error al intentar ejecutar mi aplicación de TIBCO BusinessWorks 6

java.lang.ClassCastException: class org.apache.commons.dbcp2.DelegatingCallableStatement cannot be cast to class oracle.jdbc.OracleCallableStatement (org.apache.commons.dbcp2.DelegatingCallableStatement and oracle.jdbc.OracleCallableStatement are in unnamed module of loader org.eclipse.osgi.internal.loader.EquinoxClassLoader @71cea1b8)

La siguiente linea causa el error:

rs = ((OracleCallableStatement)stmt).getCursor(3);

Esta aplicación fue migrada de la versión 5 y utilizaba una actividad Get Connection que ya no existe en la versión 6 por lo que se han auto generado clases de Java para proveer la misma funcionalidad.

Dentro de estas clases se utilizan clases de conexión a base de datos genéricas en forma de wrapper ya que la aplicación puede manejar diversos maneadores de base de datos. Esta es la razón del error al intentar hacer cast de un objeto de tipo DelegatingCallableStatement a un objeto de tipo OracleCallableStatement

Esto aplica para variables de tipo conexión y statement del paquete Java.sql

Solución

Lo que hay que hacer es quitar el wrapper al objeto utilizando el método unwrap para dejarla en su tipo de clase original la cual hay que especificar como parámetro del mismo método.
 
rs=((OracleCallableStatement)stmt.unwrap(OracleCallableStatement.class)).getCursor(3);


Espero les sirva.