i
Ejecución de Actualizaciones SQL
Las actualizaciones SQL son útiles cuando se necesita modificar un gran volumen de instancias de una entidad. La ventaja de utilizar estas actualizaciones es que la modificación se resuelve directamente sobre la base de datos, en lugar de recuperar cada instancia, modificarla y grabarla en forma individual.
Si se utiliza el objeto modelo para modificar instancias, es necesario recuperar cada una de ellas, asignar los nuevos valores y ejecutar la operación de actualización por cada instancia. Cuando la cantidad de instancias a modificar es elevada, este procedimiento no es el más performante para este requerimiento.
En cambio, con las actualizaciones SQL disponibles en Deyel SDK, se indica una única vez qué campos modificar y qué instancias alcanzar, y la modificación se realiza en forma masiva, lo que hace que el procesamiento sea más rápido y eficiente.
Al igual que en las consultas SQL, Deyel aplica automáticamente la privacidad de instancias configurada para la entidad, de modo que solo se modifican las instancias sobre las que el usuario que ejecuta la regla tiene permiso de modificación. Además, Deyel calcula y actualiza automáticamente los datos de auditoría de cada instancia modificada.
Actualizaciones para Sentencias SQL
Las actualizaciones sobre las sentencias SQL se pueden realizar mediante el uso de los siguientes objetos.
UpdateCriteria: objeto sobre el que se agregan las diferentes partes de la sentencia SQL de actualización. Con el mismo, se puede especificar qué campos de una instancia de entidad modificar y con qué valores, si se trabaja con iterativos o no, así como las condiciones que deben cumplir las instancias a modificar, que se detallan en los ejemplos.
Servicio del Formulario - Método executeUpdate(): clase servicio del formulario sobre el cual se realiza la actualización. Contiene la operación executeUpdate(formInstance, updateCriteria), que recibe como parámetros el objeto modelo de la entidad con el que se está trabajando y el objeto UpdateCriteria. Retorna un objeto UpdateResult como resultado.
Modelo del Formulario - getter ... QueryName(): clase modelo del formulario sobre la cual se quiere ejecutar la actualización SQL. Contiene métodos getter para cada uno de los campos modelados, y estos métodos tienen la particularidad de finalizar con QueryName. Deben ser utilizados al añadir las distintas partes de la sentencia a generar, tanto para los campos a modificar como para los campos de las condiciones.
UpdateResult: objeto que contiene el resultado de la ejecución de la actualización SQL. El mismo informa la cantidad de instancias de la entidad que fueron efectivamente modificadas.
Habilitación de la Funcionalidad
La ejecución de actualizaciones SQL se encuentra deshabilitada en forma predeterminada. Para poder utilizarla, es necesario habilitarla mediante la propiedad de configuración SDK_UPDATE_ENABLED. (instalación On Premise)
Adicionalmente, la propiedad SDK_UPDATE_MAX_ROWS determina la cantidad máxima de instancias que puede alcanzar una única actualización SQL. Su valor predeterminado es 1.000 instancias. Si la cantidad de instancias que cumplen con las condiciones indicadas supera ese máximo, la actualización no se ejecuta y se informa el error correspondiente.
Métodos
A continuación se describen los métodos para trabajar con los distintos objetos.
Métodos para ejecutar con el objeto UpdateCriteria
Método |
Descripción |
Parámetros |
|---|---|---|
addSet(pColumn, pValue) |
Agrega a la cláusula SET de la sentencia SQL el campo indicado, con el valor con el que se lo desea actualizar. |
String pColumn: representa el identificador del campo del formulario que se desea modificar
Tipo Object pValue: contiene el valor con el que se actualiza el campo contenido en pColumn |
addSet(pIterativeName, pColumn, pValue) |
Agrega a la cláusula SET de la sentencia SQL el campo de iterativo indicado, con el valor con el que se lo desea actualizar. |
String pIterativeName: indica el identificador del iterativo al cual pertenece el campo indicado en pColumn
String pColumn: representa el identificador del campo del formulario que se desea modificar
Tipo Object pValue: contiene el valor con el que se actualiza el campo contenido en pColumn |
addSetNull(pColumn) |
Agrega a la cláusula SET de la sentencia SQL el campo indicado, asignándole el valor nulo. |
String pColumn: representa el identificador del campo del formulario que se desea dejar sin valor |
addSetNull(pIterativeName, pColumn) |
Agrega a la cláusula SET de la sentencia SQL el campo de iterativo indicado, asignándole el valor nulo. |
String pIterativeName: indica el identificador del iterativo al cual pertenece el campo indicado en pColumn
String pColumn: representa el identificador del campo del formulario que se desea dejar sin valor |
addConditionBetween(pColumn, pValueFrom, pValueTo) |
Agrega a la sentencia la condición BETWEEN. El valor buscado estará entre los valores indicados en los parámetros pValueFrom y pValueTo. |
String pColumn: representa el identificador del campo del formulario
Tipo Object pValueFrom: representa el valor inicial a partir del cual se busca coincidencia con el valor de pColumn
Tipo Object pValueTo: representa el valor final a partir del cual se busca coincidencia con el valor de pColumn |
addConditionBetween(pIterativeName, pColumn, pValueFrom, pValueTo) |
Agrega a la sentencia la condición BETWEEN para un campo iterativo. El valor buscado estará entre los valores indicados en los parámetros pValueFrom y pValueTo. |
String pIterativeName: indica el identificador del iterativo al cual pertenece el campo indicado en pColumn
String pColumn: representa el identificador del campo del formulario
Tipo Object pValueFrom: representa el valor inicial a partir del cual se busca coincidencia con el valor de pColumn
Tipo Object pValueTo: representa el valor final a partir del cual se busca coincidencia con el valor de pColumn |
addConditionGreater(pColumn, pValue, useGreaterOrEqual) |
Agrega a la sentencia SQL la condición > o >=. |
String pColumn: representa el identificador del campo del formulario
Tipo Object pValue: contiene el valor que se compara para el campo contenido en pColumn
Boolean useGreaterOrEqual: indica si se usa o no el operador mayor o igual. Con valor "True", se utiliza >=, "False", > |
addConditionGreater(pIterativeName, pColumn, pValue, useGreaterOrEqual) |
Agrega a la sentencia SQL la condición > o >= para un campo iterativo. |
String pIterativeName: indica el identificador del iterativo al cual pertenece el campo indicado en pColumn
String pColumn: representa el identificador del campo del formulario
Tipo Object pValue: contiene el valor que se compara para el campo contenido en pColumn
Boolean useGreaterOrEqual: indica si se usa o no el operador mayor o igual. Con valor "True", se utiliza >=, "False", > |
addConditionLike(pColumn, pValue) |
Agrega a la sentencia SQL la condición LIKE. |
String pColumn: representa el identificador del campo del formulario
String pValue: contiene el valor para la condición LIKE |
addConditionLike(pIterativeName, pColumn, pValue) |
Agrega a la sentencia SQL la condición LIKE para un campo iterativo. |
String pIterativeName: indica el identificador del iterativo al cual pertenece el campo indicado en pColumn
String pColumn: representa el identificador del campo del formulario
String pValue: contiene el valor para la condición LIKE |
addConditionLower(pColumn, pValue, useLowerOrEqual) |
Agrega a la sentencia SQL la condición < o <=. |
String pColumn: representa el identificador del campo del formulario
Tipo Object pValue: contiene el valor que se compara para el campo contenido en pColumn
Boolean useLowerOrEqual: indica si se usa o no el operador menor o igual. Con valor "True", se utiliza <=, "False", < |
addConditionLower(pIterativeName, pColumn, pValue, useLowerOrEqual) |
Agrega a la sentencia SQL la condición < o <= par un campo iterativo. |
String pIterativeName: indica el identificador del iterativo al cual pertenece el campo indicado en pColumn
String pColumn: representa el identificador del campo del formulario
Tipo Object pValue: contiene el valor que se compara para el campo contenido en pColumn
Boolean useLowerOrEqual: indica si se usa o no el operador menor o igual. Con valor "True", se utiliza <=, "False", < |
addConditionNotEquals(pColumn, pValue) |
Agrega a la sentencia SQL la condición !=. |
String pColumn: representa el identificador del campo del formulario
Tipo Object pValue: contiene el valor que se compara para el campo contenido en pColumn |
addConditionNotEquals(pIterativeName, pColumn, pValue) |
Agrega a la sentencia SQL la condición != para un campo iterativo. |
String pIterativeName: indica el identificador del iterativo al cual pertenece el campo indicado en pColumn
String pColumn: representa el identificador del campo del formulario
Tipo Object pValue: contiene el valor que se compara para el campo contenido en pColumn |
addConditionEquals(pColumn, pValue) |
Agrega a la sentencia SQL la condición =. |
String pColumn: representa el identificador del campo del formulario
Tipo Object pValue: contiene el valor que se compara para el campo contenido en pColumn |
addConditionEquals(pIterativeName, pColumn, pValue) |
Agrega a la sentencia SQL la condición = par un campo iterativo. |
String pIterativeName: indica el identificador del iterativo al cual pertenece el campo indicado en pColumn
String pColumn: representa el identificador del campo del formulario
Tipo Object pValue: contiene el valor que se compara para el campo contenido en pColumn |
addConditionNotNull(pColumn) |
Agrega a la sentencia SQL la condición IS NOT NULL. |
String pColumn: representa el identificador del campo del formulario que se busca que no sea nulo |
addConditionNotNull(pIterativeName, pColumn) |
Agrega a la sentencia SQL la condición IS NOT NULL para un campo iterativo. |
String pIterativeName: indica el identificador del iterativo al cual pertenece el campo indicado en pColumn
String pColumn: representa el identificador del campo del formulario que se busca que no sea nulo |
addConditionNullable(pColumn) |
Agrega a la sentencia SQL la condición IS NULL. |
String pColumn: representa el identificador del campo del formulario que se busca que sea nulo |
addConditionNullable(pIterativeName, pColumn) |
Agrega a la sentencia SQL la condición IS NULL para un campo iterativo. |
String pIterativeName: indica el identificador del iterativo al cual pertenece el campo indicado en pColumn
String pColumn: representa el identificador del campo del formulario que se busca que sea nulo |
addConditionIN(pColumn, pValues) |
Agrega a la sentencia SQL la condición IN. |
String pColumn: representa el identificador del campo del formulario
List pValues: Este parámetro es una lista de valores (List) que serán usados en la cláusula IN de la sentencia SQL. Cada valor en esta lista representa un valor que debe ser incluido en las instancias a modificar |
addConditionIN(pIterativeName, pColumn, pValues) |
Agrega a la sentencia SQL la condición IN para un campo iterativo. |
String pIterativeName: indica el identificador del iterativo al cual pertenece el campo indicado en pColumn
String pColumn: representa el identificador del campo del formulario
List pValues: Este parámetro es una lista de valores (List) que serán usados en la cláusula IN de la sentencia SQL. Cada valor en esta lista representa un valor que debe ser incluido en las instancias a modificar |
addConditionNOTIN(pColumn, pValues) |
Agrega a la sentencia SQL la condición NOT IN. |
String pColumn: representa el identificador del campo del formulario
List pValues: Este parámetro es una lista de valores (List) que serán usados en la cláusula NOT IN de la sentencia SQL. Cada valor en esta lista representa un valor que debe ser excluido de las instancias a modificar |
addConditionNOTIN(pIterativeName, pColumn, pValues) |
Agrega a la sentencia SQL la condición NOT IN para un campo iterativo. |
String pIterativeName: indica el identificador del iterativo al cual pertenece el campo indicado en pColumn
String pColumn: representa el identificador del campo del formulario
List pValues: Este parámetro es una lista de valores (List) que serán usados en la cláusula NOT IN de la sentencia SQL. Cada valor en esta lista representa un valor que debe ser excluido de las instancias a modificar |
Métodos para trabajar con el objeto UpdateResult
Método |
Descripción |
Parámetros |
|---|---|---|
getAffectedRows(): int |
Devuelve la cantidad de instancias de la entidad que fueron efectivamente modificadas por la sentencia SQL ejecutada. |
Método para ejecutar con el objeto Servicio de Formulario
Método |
Descripción |
Parámetros |
|---|---|---|
executeUpdate(formInstance, updateCriteria): UpdateResult |
Ejecuta una sentencia SQL de actualización basada en los criterios especificados y devuelve un objeto UpdateResult con el resultado correspondiente. |
formInstance: objeto del modelo de la entidad con el cual se está trabajando y sobre el que se ejecuta la sentencia SQL.
updateCriteria: objeto UpdateCriteria que contiene la configuración de la sentencia SQL, configurada a través de los métodos disponibles en dicha clase. |
Ejemplos de Ejecución
1.Actualización
En este ejemplo, se actualiza el estado de las cuentas cuyas ganancias anuales sean mayores a 500.000, asignándoles el estado activo, que corresponde al código "1". Se informa la cantidad de cuentas que fueron modificadas.
UpdateCriteria xUpdateCriteria = new UpdateCriteria();
//Creación de objeto modelo Cuenta xCuenta = new Cuenta();
//Creación del servicio para la entidad CuentaService xCuentaService = new CuentaService(getApiClient());
//Campo a modificar y valor con el que se lo actualiza xUpdateCriteria.addSet(Cuenta.getCdStatusQueryName(), "1");
//Agregar condiciones que deben cumplir las cuentas a modificar xUpdateCriteria.addConditionGreater(Cuenta.getQtAnualRevQueryName(), 500000, false);
//Ejecución de la actualización y obtención del resultado UpdateResult xUpdateResult = xCuentaService.executeUpdate(xCuenta, xUpdateCriteria);
log("Se modificaron " + xUpdateResult.getAffectedRows() + " cuentas");
|
2.Campos a Modificar
Para indicar los campos que se desean modificar, se dispone de dos métodos que permiten incorporar al objeto UpdateCriteria la cláusula SET correspondiente.
Primer Método
addSet(String pColumnName, Object pValue)
|
Este método incorpora al objeto UpdateCriteria el campo indicado en pColumnName junto con el valor indicado en pValue, con el que se actualiza dicho campo. El valor debe corresponder con el tipo de dato del campo.
xUpdateCriteria.addSet(Cuenta.getDsCompanyQueryName(), "ACME S.A.");
|
Segundo Método
|
Este método incorpora al objeto UpdateCriteria el campo indicado en pColumnName, asignándole el valor nulo, es decir, dejándolo sin valor.
xUpdateCriteria.addSetNull(Cuenta.getQtAnualRevQueryName());
|
Se pueden agregar tantos campos como se deseen modificar, invocando nuevamente a los métodos correspondientes. Cada campo puede indicarse una única vez: si se agrega un campo que ya había sido agregado previamente, la ejecución de la actualización SQL fallará.
Es obligatorio indicar al menos un campo a modificar. En caso contrario, la ejecución de la actualización SQL fallará.
3.Campos que no Pueden ser Modificados
Existen campos administrados por Deyel que no pueden ser modificados mediante una actualización SQL. Si se intenta agregarlos a la cláusula SET, la ejecución de la actualización SQL fallará.
Estos campos son:
•Los campos de auditoría de la instancia, ya que son calculados automáticamente por Deyel: usuario y fecha de alta, usuario y fecha de última modificación.
•El dueño de la instancia, ya que determina la privacidad de la misma.
•El número de secuencia de las filas de un iterativo.
•Los campos internos de la plataforma.
4.Condiciones de Selección de Instancias
Al objeto UpdateCriteria se le pueden agregar diversas condiciones, que determinan qué instancias de la entidad son alcanzadas por la actualización. Estas condiciones son las mismas que se encuentran disponibles para las consultas SQL y se utilizan de la misma manera.
Es obligatorio indicar al menos una condición. Las condiciones disponibles utilizan los operadores "igual", "distinto", "mayor", "mayor igual", "menor", "menor igual", "entre", "like", "es nulo", "no es nulo", "está en" y "no está en" con el método addCondition correspondiente.
Para cada tipo de condición, se encuentran disponibles dos métodos:
•Método para campos pertenecientes a iterativos: Utilizado para agregar condiciones a campos que forman parte de un contenedor iterativo.
•Método para campos no pertenecientes a iterativos: Utilizado para agregar condiciones a campos que no forman parte de un contenedor iterativo.
Todas las condiciones agregadas deben cumplirse simultáneamente para que una instancia sea alcanzada por la actualización.
En el siguiente ejemplo, se actualiza el estado de las cuentas cuya razón social cumpla con el patrón '%ACME%' y cuyas ganancias anuales estén entre 500.000 y 800.000.
xUpdateCriteria.addSet(Cuenta.getCdStatusQueryName(), "1");
xUpdateCriteria.addConditionLike(Cuenta.getDsCompanyQueryName(), "%ACME%"); xUpdateCriteria.addConditionBetween(Cuenta.getQtAnualRevQueryName(), 500000, 800000);
|
A continuación se muestran los métodos disponibles para cada operador.
Operador "Entre"
|
|
// Alcanza las cuentas cuyo campo qtAnualRev esté entre los valores 500.000 y 800.000 xUpdateCriteria.addConditionBetween(Cuenta.getQtAnualRevQueryName(), 500000, 800000);
|
Operador "Mayor A", "Mayor o Igual A"
La distinción entre el uso del operador "mayor o igual" y el operador "mayor" se realiza a través del último parámetro del método correspondiente.
Los valores posibles para este parámetro son:
•True: Se utiliza el operador "mayor o igual" (>=).
•False: Se utiliza el operador "mayor" (>).
|
|
// Alcanza las cuentas cuyo campo qtAnualRev sea mayor a 500.000 xUpdateCriteria.addConditionGreater(Cuenta.getQtAnualRevQueryName(), 500000, false);
|
Operador "Menor A", "Menor o Igual A"
La distinción entre el uso del operador "menor" y el operador "menor o igual" se realiza a través del último parámetro del método correspondiente. Los valores posibles para este parámetro son:
•True: Se utiliza el operador "menor o igual" (<=).
•False: Se utiliza el operador "menor" (<).
|
|
// Alcanza las cuentas cuyo campo qtAnualRev sea menor o igual a 500.000 xUpdateCriteria.addConditionLower(Cuenta.getQtAnualRevQueryName(), 500000, true);
|
Operador "Like"
|
|
Para utilizar la condición "Like", es necesario enviar el patrón de búsqueda completo como tipo String. Esto incluye los caracteres "%" que se usan como comodines en el patrón.
// Alcanza las cuentas cuyo campo dsCompany cumpla con el patrón '%ACME%' xUpdateCriteria.addConditionLike(Cuenta.getDsCompanyQueryName(), "%ACME%");
|
Operador "Distinto"
|
|
// Alcanza las cuentas cuyo campo dsCompany no sea igual a "ACME" xUpdateCriteria.addConditionNotEquals(Cuenta.getDsCompanyQueryName(), "ACME");
|
Operador "Igual"
|
|
// Alcanza las cuentas cuyo campo cdStatus sea igual a "1" xUpdateCriteria.addConditionEquals(Cuenta.getCdStatusQueryName(), "1");
|
Operador "No es Nulo"
|
|
// Alcanza las cuentas cuyo campo cdStatus no sea nulo xUpdateCriteria.addConditionNotNull(Cuenta.getCdStatusQueryName());
|
Operador "Es Nulo"
|
|
// Alcanza las cuentas cuyo campo cdStatus sea nulo xUpdateCriteria.addConditionNullable(Cuenta.getCdStatusQueryName());
|
Operador "Está En"
|
|
// Alcanza las cuentas cuyo campo dsIndustry esté en el conjunto de valores incluidos // en xElements (4 y 6) List xElements = new ArrayList(); xElements.add(4); xElements.add(6);
xUpdateCriteria.addConditionIN(Cuenta.getDsIndustryQueryName(), xElements);
|
Operador "No Está En"
|
|
// Alcanza las cuentas cuyo campo dsIndustry no esté en el conjunto de valores incluidos // en xElements (4 y 6) List xElements = new ArrayList(); xElements.add(4); xElements.add(6);
xUpdateCriteria.addConditionNOTIN(Cuenta.getDsIndustryQueryName(), xElements);
|
5.Trabajar con Campos de Iterativos
Además de los campos de la entidad, se pueden modificar campos que pertenezcan a un contenedor iterativo de la misma, y también se pueden utilizar campos de iterativos en las condiciones de selección.
Tanto para modificar un campo de un iterativo como para agregar una condición sobre él, es necesario indicar el identificador del iterativo al que pertenece el campo como primer parámetro del método correspondiente. Si no se lo indica, la ejecución de la actualización SQL fallará.
Para trabajar con los campos del iterativo, es necesario utilizar la clase del iterativo, que está incluida dentro del objeto modelo del formulario.
En el siguiente ejemplo, se actualiza el país de las direcciones registradas como "Argentina" en el iterativo lsAddress de las cuentas cuyo estado sea activo.
CuentaService xCuentaService = new CuentaService(getApiClient());
//Campo del iterativo lsAddress a modificar, indicando el iterativo al que pertenece xUpdateCriteria.addSet(Cuenta.getLsAddressQueryName(), Cuenta.LsAddress.getDsCountryQueryName(), "República Argentina");
//Condición sobre un campo del iterativo, indicando el iterativo al que pertenece xUpdateCriteria.addConditionEquals(Cuenta.getLsAddressQueryName(), Cuenta.LsAddress.getDsCountryQueryName(), "Argentina");
//Condición sobre un campo de la entidad xUpdateCriteria.addConditionEquals(Cuenta.getCdStatusQueryName(), "1");
UpdateResult xUpdateResult = xCuentaService.executeUpdate(new Cuenta(), xUpdateCriteria);
log("Se modificaron " + xUpdateResult.getAffectedRows() + " cuentas");
|
Al trabajar con campos de iterativos, deben tenerse en cuenta las siguientes consideraciones.
Las condiciones indicadas sobre un iterativo también determinan qué filas del mismo se modifican. En el ejemplo anterior, solamente se actualizan las filas del iterativo cuyo país sea "Argentina", y no la totalidad de las filas de las cuentas alcanzadas. Si no se indica ninguna condición sobre el iterativo, se modifican todas sus filas.
Se modifican las filas existentes del iterativo. Una actualización SQL no permite agregar ni eliminar filas de un contenedor iterativo. Si se necesita modificar la cantidad de filas, debe utilizarse la operación de actualización sobre el objeto modelo de la instancia.
La cantidad de instancias modificadas no contempla las filas de los iterativos. El método getAffectedRows() informa la cantidad de instancias de la entidad que fueron modificadas, y no la cantidad de filas de iterativos que fueron modificadas.
6.Privacidad de Instancias
Cuando la entidad se encuentra configurada con privacidad de instancias, Deyel agrega automáticamente a la sentencia SQL la condición de privacidad correspondiente a la acción de modificación, de modo que la actualización alcanza únicamente a:
•las instancias que no tienen dueño asignado,
•las instancias cuyo dueño es el usuario que ejecuta la regla,
•las instancias de los subordinados del usuario que ejecuta la regla, habilitados para modificación, y
•las instancias de los usuarios que el usuario que ejecuta la regla subroga.
Si el usuario tiene un permiso global de modificación sobre la entidad, la actualización alcanza a la totalidad de las instancias que cumplen con las condiciones indicadas.
Esta condición se agrega siempre y no puede ser modificada desde la regla. Adicionalmente, el usuario que ejecuta la regla debe tener habilitada la función de modificación sobre la entidad.
7.Datos de Auditoría
Deyel calcula y actualiza automáticamente los datos de auditoría de cada instancia modificada, registrando el usuario que ejecuta la regla como usuario de última modificación y el momento de la ejecución como fecha de última modificación.
Los datos de alta de la instancia se conservan sin cambios.
Como se indicó anteriormente, estos campos no pueden ser modificados desde la regla.
Cuando la actualización modifica únicamente campos de un iterativo, los datos de auditoría de la instancia a la que pertenece se actualizan igualmente.
8.Restricciones
La ejecución de una actualización SQL falla en los siguientes casos:
•La funcionalidad no se encuentra habilitada en la instalación.
•El usuario que ejecuta la regla no tiene habilitada la función de modificación sobre el formulario.
•No se indicó ningún campo a modificar.
•No se indicó ninguna condición de selección de instancias.
•Se indicó un mismo campo a modificar más de una vez.
•Se intentó modificar un campo administrado por Deyel.
•Se indicó un campo de iterativo sin indicar el iterativo al que pertenece, o un campo que no pertenece al iterativo indicado.
•Se utilizaron campos de otra entidad. A diferencia de las consultas SQL, las actualizaciones SQL no permiten realizar operaciones JOIN entre entidades.
9.Consideraciones
Una actualización SQL modifica las instancias directamente sobre la base de datos. Por lo tanto, a diferencia de la operación de actualización sobre el objeto modelo de la instancia, no se ejecutan:
•las validaciones configuradas en el modelador para la acción de modificación,
•las validaciones de relaciones con otras entidades,
•las reglas de negocio asociadas a la modificación de la instancia,
Si alguno de estos procedimientos es necesario, debe utilizarse una consulta SQL para recuperar los identificadores de las instancias y luego ejecutar la operación de actualización sobre el objeto modelo de cada una de ellas. El procesamiento es más lento, pero conserva la totalidad del ciclo de vida de la instancia.
La actualización se ejecuta dentro de la misma transacción que el resto de la regla, por lo que si la regla falla luego de la actualización, las modificaciones se revierten junto con el resto de la transacción.
Cada ejecución de una actualización SQL queda registrada en la consola de ejecución.