#Namespace

0 Seguidores · 17 Publicaciones

Un espacio de nombres es una entidad lógica que proporciona acceso a los datos y al código, que se storedin múltiples bases de datos.

InterSystems Official Mario Sanchez Macias · jun 12, 2025

InterSystems ha publicado nuevas actualizaciones puntuales para resolver un defecto que afecta a las versiones anteriores más recientes de 2025.1.0, 2024.1.4, 2023.1.6 y 2022.1.7, en las siguientes líneas de productos compatibles:

  • InterSystems IRIS
  • InterSystems IRIS for Health
  • HealthShare Health Connect

Este problema podría provocar errores inesperados de tipo <PROTECT> o anomalías de acceso al utilizar funciones como:

  • Namespaces implícitos
  • Acceso mixto de solo lectura/lectura-escritura a bases de datos
  • Páginas del Portal de Administración para listar rutinas y globals

Síntomas incluidos:

0
0 32
Artículo Katherine Duran · mayo 27, 2025 7m read

InterSystems IRIS permite ejecutar consultas SQL directamente desde ObjectScript mediante:

  • SQL Embebido (Embedded SQL): consultas SQL compiladas en tiempo de desarrollo, con chequeo de tipos y mayor eficiencia.
  • SQL Dinámico (Dynamic SQL): permite construir y ejecutar sentencias SQL en tiempo de ejecución, ideal para casos flexibles o condicionales.

Que es SQL (Structured Query Language) es un lenguaje estándar utilizado para interactuar con bases de datos relacionales. Permite realizar operaciones como:

3
7 180
Artículo Luis Angel Pérez Ramos · feb 20, 2025 3m read

Es posible que hayáis notado que, para configurar un mirror en InterSystems IRIS for Health™ y HealthShare® Health Connect, hay un requisito especial. En este artículo, quiero guiaros paso a paso por el proceso.

Esto supone que ya habéis configurado el segundo miembro de conmutación por error y habéis confirmado un estado exitoso de dicho miembro en el monitor del mirror:

Paso 1: Activad el usuario HS_Services (en el servidor de respaldo y en el principal).

2
1 91
Artículo Alberto Fuentes · jul 16, 2024 4m read

wsgi_logo

Contexto

La Interfaz de Pasarela de Servidor Web (WSGI, por sus siglas en inglés) es una convención de llamada para que los servidores web puedan reenviar solicitudes a aplicaciones o frameworks web escritos en el lenguaje de programación Python. WSGI es un estándar de Python descrito en detalle en PEP 3333.

🤔 Ok, gran definición, ¿y qué tiene que ver con IRIS?

IRIS 2024.2+ tiene una nueva característica que os permite ejecutar aplicaciones WSGI directamente en IRIS. Esta característica es una excelente manera de integrar IRIS con otros frameworks y bibliotecas de Python.

Esto sigue la tendencia de la experiencia Python primero, donde podéis usar Python para interactuar con IRIS, y ahora también podéis ejecutar aplicaciones Python directamente en IRIS.

Cómo usarla

Para instanciar una aplicación WSGI en IRIS, necesitáis configurarla en la sección Seguridad->Aplicaciones->Aplicaciones Web del Portal de Gestión de IRIS.

Ejemplo simple de Flask:

Archivo llamado app.py en el directorio /irisdev/app/community:

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello, World!'

Configuración de la Interfaz de Usuario

image

En esta sección, podéis configurar la aplicación WSGI introduciendo lo siguiente:

  • Nombre de Aplicación

  • esto corresponde al nombre del archivo de la aplicación WSGI.

  • Ejemplo: app.py pero sin la extensión .py: app.

  • Nombre de la función a llamar

    • la función invocable que será llamada por el servidor WSGI

    • por ejemplo, app corresponde a la variable app en el archivo app.py

      • app = Flask(__name__)
  • Directorio de aplicaciones WSGI

    • la ruta donde se encuentra la aplicación WSGI
    • ej: /irisdev/app/community
  • Tipo de protocolo Python

    • puede ser wsgi o asgi
      • wsgi es el valor por defecto y el utilizado en este ejemplo
      • asgi es para aplicaciones asíncronas
        • por ahora soportamos asgi de forma sincronizada con el adaptador a2wsgi
  • DEBUG

    • si está marcada, la aplicación WSGI se ejecutará en modo depuración
      • esto es útil para fines de desarrollo, ya que cualquier cambio en la aplicación WSGI se recargará automáticamente

Fusión fichero CPF

También podéis configurar la aplicación WSGI utilizando el fichero de configuración CPF de IRIS. He aquí un ejemplo de configuración:

[Actions]
CreateApplication:Name=/flask,NameSpace=IRISAPP,WSGIAppLocation=/irisdev/app/community/,WSGIAppName=app,WSGICallable=app,Type=2,DispatchClass=%SYS.Python.WSGI,MatchRoles=:%ALL,WSGIDebug=0,WSGIType=0

Archivos de registro

Los registros de la aplicación (logs) WSGI se almacenan en el archivo WSGI.log ubicado en el directorio mgr de la instancia.

Ejemplos

Aquí tenéis algunos ejemplos de aplicaciones WSGI que podéis ejecutar en IRIS, pretenden mostrar cómo ejecutar diferentes frameworks de Python en IRIS.

Básicamente, el caso de uso será el mismo para todos los frameworks:

Endpoints

  • /iris - Devuelve un objeto JSON con las 10 principales clases presentes en el espacio de nombres IRISAPP.
  • /interop - Un endpoint que hará de "ping" para probar el framework de interoperabilidad de IRIS.
  • /posts - Un endpoint CRUD sencillo para un objeto Post.
  • /comments - Un endpoint CRUD sencillo para un objeto Comment.

Modelo de objeto

Objeto Post:

  • id
  • title
  • content

Objeto Comment:

  • id
  • post_id (foreign key to Post)
  • content

Flask

Django

FastAPI

Limitaciones

  • El ASGI es soportado sincrónicamente por ahora con el adaptador a2wsgi.
  • Las aplicaciones tornado ( jupyter, streamlit, .. ) no están soportadas ya que no son compatibles con WSGI.
2
0 346
Artículo Luis Angel Pérez Ramos · ene 22, 2025 1m read

¡Hola! He ampliado mi repositorio de demostración, andreas5588/demo-dbs-iris, para facilitar las pruebas de las funciones FOREIGN SERVER y FOREIGN TABLE en IRIS.

Para lograrlo, creé un espacio de nombres llamado FEDERATION. La idea es la siguiente:

  1. Configurad conexiones JDBC para cada espacio de nombres.
  2. Cread un FOREIGN SERVER dentro del espacio de nombres FEDERATION para cada conexión.
  3. Definid al menos una FOREIGN TABLE basada en cada servidor externo.

El Script:  demo-dbs-iris/src/sql/02_create_foreign_server.sql

0
0 47
Artículo Luis Angel Pérez Ramos · dic 5, 2024 2m read

A la hora de construir una imagen de IRIS, podéis usar archivos CPF Merge.

Aquí tenéis un ejemplo de CPF Merge:

[Actions]
CreateDatabase:Name=IRISAPP_DATA,Directory=/usr/irissys/mgr/IRISAPP_DATA

CreateDatabase:Name=IRISAPP_CODE,Directory=/usr/irissys/mgr/IRISAPP_CODE

CreateNamespace:Name=IRISAPP,Globals=IRISAPP_DATA,Routines=IRISAPP_CODE,Interop=1

ModifyService:Name=%Service_CallIn,Enabled=1,AutheEnabled=48

CreateApplication:Name=/frn,NameSpace=IRISAPP,DispatchClass=Formation.REST.Dispatch,AutheEnabled=48

ModifyUser:Name=SuperUser,PasswordHash=a31d24aecc0bfe560a7e45bd913ad27c667dc25a75cbfd358c451bb595b6bd52bd25c82cafaa23ca1dd30b3b4947d12d3bb0ffb2a717df29912b743a281f97c1,0a4c463a2fa1e7542b61aa48800091ab688eb0a14bebf536638f411f5454c9343b9aa6402b4694f0a89b624407a5f43f0a38fc35216bb18aab7dc41ef9f056b1,10000,SHA512

El archivo CPF Merge es un archivo de texto que, por ejemplo, contiene un conjunto de acciones. En este caso, creamos dos bases de datos, un namespace, habilitamos el servicio CallIn, creamos una aplicación web y un usuario.

El archivo CPF Merge puede ejecutarse cuando IRIS se inicia utilizando esta variable de entorno:

ISC_CPF_MERGE_FILE=/tmp/iris.cpf

Puede ser útil usar esta variable de entorno para construir una imagen de IRIS.

Aquí tenéis un ejemplo de Dockerfile:

ARG IMAGE=intersystemsdc/iris-community:latest
FROM $IMAGE as builder

WORKDIR /irisdev/app
RUN chown ${ISC_PACKAGE_MGRUSER}:${ISC_PACKAGE_IRISGROUP} /irisdev/app
USER ${ISC_PACKAGE_MGRUSER}

COPY . /irisdev/app

ENV ISC_CPF_MERGE_FILE=/irisdev/app/merge.cpf

RUN iris start IRIS \
    && iris session IRIS < /irisdev/app/iris.script \
    && iris stop IRIS quietly

Durante la construcción, cuando se ejecuta el comando iris start IRIS, se ejecuta el archivo CPF Merge.

¡Esperamos que esto os sea de ayuda!

0
0 42
Artículo Alberto Fuentes · sep 20, 2024 5m read

¡Hola a todos de nuevo!

En el artículo anterior hablamos de iris-datapipe, un framework diseñado para ayudarte a definir "pipes" de datos con un patrón de ingesta y procesamiento. Hoy veremos cómo puedes instalarlo y configurarlo paso a paso.

iris-datapipe incluye un QuickStart, que te permite probarlo rápidamente utilizando un contenedor Docker preconfigurado.

Pero, ¿qué debes hacer si quieres usarlo en tu propia instancia?

InterSystems IRIS

Instalación del paquete

s r=##class(%Net.HttpRequest).%New(),r.Server="pm.community.intersystems.com",r.SSLConfiguration="ISC.FeatureTracker.SSL.Config" d r.Get("/packages/zpm/latest/installer"),$system.OBJ.LoadStream(r.HttpResponse.Data,"c")
zpm "install iris-datapipe"

Configuración de usuarios y seguridad

iris-datapipe requiere ciertos recursos de seguridad:

  • DP_ADMIN - Administrador de DataPipe.
  • DP_MENU_DASHBOARD - Acceso al menú "Dashboard" en la interfaz gráfica.
  • DP_MENU_SEARCH - Acceso al menú "Search" en la interfaz gráfica.

Necesitarás crear un usuario con acceso a la interfaz gráfica y que utilice estos recursos. A continuación, te muestro un ejemplo de cómo hacerlo:

Crear recursos de seguridad:

zn "%SYS"
write ##class(Security.Resources).Create("DP_ADMIN","DataPipe Admin Privilege")
write ##class(Security.Resources).Create("DP_MENU_DASHBOARD","DataPipe UI Dashboard Menu Access")
write ##class(Security.Resources).Create("DP_MENU_SEARCH","DataPipe UI Search Menu Access")

Crear un nuevo rol llamado DataPipe_Admin:

(¡Importante! Debes otorgarle permisos sobre la base de datos donde hayas instalado iris-datapipe. En este ejemplo, lo hago sobre %DB_USER)

write ##class(Security.Roles).Create("DataPipe_Admin","DataPipe Administrator","DP_ADMIN:RWU,DP_MENU_DASHBOARD:RWU,DP_MENU_SEARCH:RWU,%DB_USER:RW,%DB_IRISSYS:R")

Añadir privilegios de SQL sobre tablas y vistas necesarias al rol DataPipe_Admin:

GRANT INSERT,SELECT,UPDATE ON DataPipe_Data.Pipe, DataPipe_Data.Preference TO DataPipe_Admin
GRANT SELECT ON DataPipe_Data.VInbox, DataPipe_Data.VIngestion, DataPipe_Data.VStaging, DataPipe_Data.VOper TO DataPipe_Admin

Crear un usuario de ejemplo dpadmin con la contraseña demo y asignarlo al rol DataPipe_Admin:

write ##class(Security.Users).Create("dpadmin","DataPipe_Admin","demo")

Otras consideraciones

Para que la interfaz gráfica funcione correctamente, es importante tener en cuenta la configuración de CORS (Cross-Origin Resource Sharing) y los permisos sobre la base de datos donde tengas instalado DataPipe.

CORS (Cross-Origin Resource Sharing)

El navegador que utilices para acceder a la interfaz web enviará solicitudes a tu servidor InterSystems IRIS. Como parte de este proceso, el navegador preguntará a IRIS si está permitido realizar estas solicitudes desde su origen (esto es, desde donde estés sirviendo la aplicación web). Puedes encontrar más información en la documentación oficial.

Una manera sencilla de permitir solicitudes desde cualquier origen (incluido localhost) es utilizar directamente esta clase que se usa en el entorno de QuickStart.

Sin embargo, ten en cuenta que siempre debes restringir los posibles orígenes antes de poner un sistema en producción. En el ejemplo proporcionado, necesitarías modificar el método OnHandleCorsRequest.

Permisos sobre la base de datos

Es necesario que las solicitudes web que lleguen desde el WebGateway, como CSPSystem, tengan permiso para leer la base de datos donde está instalado iris-datapipe.

En mi ejemplo, una forma sencilla de lograrlo es otorgarle directamente permisos a CSPSystem sobre %DB_USER.

Interfaz gráfica

La interfaz gráfica es una aplicación Angular que puedes encontrar aquí: iris-datapipeUI.

Si tienes conocimientos de Angular, no necesitarás mucha explicación. Solo debes saber que puedes hacer un fork/duplicado del repositorio y adaptarlo según tus necesidades.

Si no estás familiarizado con Angular, puedes seguir estos pasos utilizando Docker para simplificar el proceso:

  • Clona o descarga el repositorio iris-datapipeUI.
  • Modifica el archivo environment.ts para sustituir las URLs de IRIS por las de tu entorno.
  • Prepara una imagen Docker con la aplicación construida:
docker compose build 
  • Ejecuta un contenedor con la imagen que acabas de preparar:
docker compose up -d

Si has seguido los pasos y todo va bien, deberías poder hacer login en la interfaz gráfica con tu usuario dpadmin / demo y verás un entorno vacío: image

En un próximo artículo hablaremos de cómo crear e implementar "pipes" en iris-datapipe.

0
0 73
Artículo Daniel Aguilar · mayo 19, 2024 4m read

   

📜 Santa Tecla, versículo 8: "Extiende tu ratón sobre la pantalla, y el mar de datos abrirá un sendero delante de ti!!"

Hola comunidad, lo primero perdón si a alguien le ha ofendido la blasfemia 😔 

¿Alguna vez has pensado que sería interesante tener separado el código fuente de los datos de la base de datos?. Quizás te gustaría poder hacer copias de seguridad de tu código sin tener que copiar gigas de información de los datos de tus clientes.

A continuación os explico los pasos para separar en 2 bases de datos distintas vuestro mar formado por el código fuente y los datos de un namespace.

0
1 199
Artículo Yone Moreno · mayo 17, 2024 52m read

🙂 Buenos días comunidad.

Me gustaría compartir con ustedes, en este artículo, una manera muy práctica, de obtener información relevante de todos los Namespaces de un Entorno. ¿Para qué?. Pues por ejemplo para uno de los casos de uso que más nos encontramos los desarrolladores con respecto a Healtshare: el desafío de necesitar crear 1 servicio, y la odisea de ir entorno a entorno, namespace a namespace, buscando si el puerto XYZAB está libre o no... 🙃

0
0 123
Pregunta Kurro Lopez · ene 31, 2024

Hola comunidad.

Hemos desarrollado una nueva versión de una producción, todo el código es nuevo y ha cambiado BP. Esta aplicación carga información para algunas marcas y la almacena en la base de datos.

El cliente quiere implementar los cambios solo para algunas marcas porque quiere verificar las marcas pequeñas antes de implementarlos para todas las marcas.

Mi propuesta es crear un nuevo namespace, con el nuevo código, y deshabilitar todas las marcas excepto la marca que quiere probar.

Me pregunto cuál es la mejor manera de clonar el namespace.

6
0 201
Pregunta Robert Cemper · mayo 31, 2021

Cuando inicio una instalación nueva de IRIS o de un contenedor, siempre encuentro los paquetes de interoperabilidad mapeados en el namespace USER.

¿Existe alguna utilidad para quitar este mapeo de forma sencilla, con un clic?
Quitar el mapeo global a global, rutina a rutina, paquete a paquete es muy aburrido.

Es decir: busco una utilidad dentro de IRIS.

La utilidad externa es obvia: Notepad (o cualquier otro editor de texto) 
- limpiar iris,cpf,
- reiniciar IRIS

Es rápido, es eficiente, pero es muy tedioso.

1
0 138
Artículo Kurro Lopez · mar 17, 2021 3m read

Tanto si accedes a DeepSee por primera vez como si estás configurando DeepSee en una instancia nueva, puedes encontrar dos incidencias habituales después de hacer clic en la opción "DeepSee" en el Portal de Administración del Sistema.

Incidencia #1: ¡Arquitech/Analyzer aparece en gris!

Incidencia #2: Se debe habilitar DeepSee antes de su uso.

Incidencia #1: ¡Arquitech/Analyzer aparece en gris!

Existen dos causas comunes para este problema.

Causa 1 - La licencia

Causa 2 - La seguridad

La primera causa común es que la licencia no tiene habilitadas estas opciones de DeepSee. Para confirmar si estas opciones están habilitadas, puedes ejecutar el siguiente código desde el terminal:

    do $system.License.Decode()

Esta tabla describe qué opciones de la licencia se deben habilitar para acceder a cada componente de DeepSee:

<td>
  Salida del decodificador de licencias
</td>
<td>
  DeepSee Analyze habilitado.
</td>
<td>
  DeepSee Model habilitado.
</td>
Componente de DeepSee
DeepSee Analyzer
DeepSee Architect

Cuando se activa una licencia con estas opciones, los enlaces SMP deberían estar disponibles.

La segunda causa común es que el usuario no tiene suficientes privilegios.

Para acceder a DeepSee Analyzer, el usuario deberá tener: %DeepSee_Analyzer

Para acceder al DeepSee Architect, el usuario deberá tener: %DeepSee_Architect

Puede encontrar más información sobre los recursos de DeepSee aquí: http://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=D2IMP_ch_security#D2IMP_security_overview

Incidencia #2: Se debe habilitar DeepSee antes de su uso.

Todas las aplicaciones web que utilizan DeepSee deben estar habilitadas antes de utilizar la interfaz web. Hay dos formas de habilitar DeepSee.

Para versiones anteriores a la 2015.1: http://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=GCSP_config#GCSP_appaccess_deepsee

Para las versiones 2015.1 y posteriores:

http://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=D2IMP_ch_setup#D2IMP_setup_web_app

Hay varias formas en las que el namespace de un "DeepSee deshabilitado" se presentará a sí mismo al intentar acceder a DeepSee por medio de un navegador.

La primera forma es ver un mensaje de Forbidden o HTTP 403 Forbidden desde tu navegador cuando se intenta acceder a una página del Portal de administración de DeepSee. Diferentes navegadores y diferentes versiones de Caché presentarán este error de diferentes maneras. Aquí puedes ver la misma URL solicitada en Firefox y en Internet Explorer:

También ha habido casos en los que se muestra una página de error CSP con un estado 403, que es el código de error del servidor web para Forbidden.

Se ha trabajado en el SMP para evitar que estos errores de Forbidden sean inaccesibles. Si se selecciona un namespace que no tiene DeepSee habilitado y se hace clic en la opción “DeepSee”, debería aparecer este mensaje: “El namespace <namespace> no es compatible con DeepSee”. Esto significa que DeepSee no está habilitado y se debe utilizar uno de los métodos mencionados anteriormente para habilitar DeepSee.

  ¡Ahora es momento de acceder a DeepSee y compartir vuestras experiencias!

0
0 197
Artículo Ricardo Paiva · jun 19, 2020 2m read

¡Hola desarrolladores!

¿Os habéis encontrado con la necesidad de crear una base de datos, un namespace o una aplicación web de manera programática? Quiero compartir con vosotros un fragmento de código ObjectScript que permite crear una base de datos, un namespace y una aplicación web para InterSystems IRIS.

	set currentNS = $namespace
	
	zn "%SYS"
	
	write "Create DB ...",!
	set dbName="testDB"
 	set dbProperties("Directory") = "/InterSystems/IRIS/mgr/testDB"
 	set status=##Class(Config.Databases).Create(dbName,.dbProperties)
	write:'status $system.Status.DisplayError(status)
	write "DB """_dbName_""" was created!",!!
	
	
	write "Create namespace ...",!
	set nsName="testNS"
	//DB for globals
	set nsProperties("Globals") = dbName
	//DB for routines
	set nsProperties("Routines") = dbName
	set status=##Class(Config.Namespaces).Create(nsName,.nsProperties)
	write:'status $system.Status.DisplayError(status)
	write "Namespace """_nsName_""" was created!",!!
	
	
	write "Create web application ...",!
	set webName = "/csp/testApplication"
	set webProperties("NameSpace") = nsName
	set webProperties("Enabled") = $$$YES
	set webProperties("IsNameSpaceDefault") = $$$YES
	set webProperties("CSPZENEnabled") = $$$YES
	set webProperties("DeepSeeEnabled") = $$$YES
	set webProperties("AutheEnabled") = $$$AutheCache
	set status = ##class(Security.Applications).Create(webName, .webProperties)
	write:'status $system.Status.DisplayError(status)
	write "Web application """webName""" was created!",!
	
	zn currentNS

También podéis consultar estos manuales:

0
0 426