Insertar, modificar o borrar filas en una Base de Datos externa

10 comentarios

En general, lo recomendable es que todas tus tablas estén en una sola Base de Datos ya que así puedes relacionar muy fácilmente a esas tablas entre sí. Sin embargo a veces no puedes evitar tener dos o más bases de datos. En ese caso: ¿cómo harías para insertar, modificar o borrar filas en una tabla que se encuentra en la otra Base de Datos?

El comando EXECUTE STATEMENT viene rápidamente en tu ayuda.

CREATE PROCEDURE INSERTAR_EN_BASEDATOS_EXTERNA_1
AS
   DECLARE VARIABLE lcComando VARCHAR(200);
   DECLARE VARIABLE lnIdenti  BIGINT;
   DECLARE VARIABLE lcNombre  VARCHAR(40);
BEGIN

   lnIdenti = 0;
   lcNombre = '''Esta es una prueba''';

   lcComando = 'INSERT INTO TARJETAS(TAR_IDENTI, TAR_NOMBRE) VALUES(' ||
               :lnIdenti || ',' || :lcNombre || ')';

   EXECUTE STATEMENT
      lcComando
   ON EXTERNAL
      'E:\BASESDATOS\CONTABILIDAD.FDB'
   AS
      USER 'SYSDBA' PASSWORD 'masterkey';
END;

Como puedes ver la variable lcNombre está rodeada por tres apóstrofos ¿por qué eso? porque si no se hace así ocurre un error ya que el contenido de esa variable debe estar rodeado de apóstrofos en el comando INSERT INTO. Cuando quieres que dentro de un string aparezca un apóstrofo debes escribir dos apóstrofos seguidos. Por ese motivo tuve que escribir tres apóstrofos.

Quizás también hayas notado que aunque la variable lnIdenti es numérica se la concatenó sin necesidad de convertirla previamente a tipo carácter, esa es una gran facilidad que nos da el Firebird.

En este ejemplo, los valores que insertamos en las columnas TAR_IDENTI y TAR_NOMBRE son constantes, sin embargo lo más común es que necesitemos insertar valores variables, como se ve en el siguiente ejemplo:

CREATE PROCEDURE INSERTAR_EN_BASEDATOS_EXTERNA_2(
   tnIdenti BIGINT,
   tcNombre VARCHAR(40))
AS
   DECLARE VARIABLE lcComando VARCHAR(200);
BEGIN

   lcComando = 'INSERT INTO TARJETAS(TAR_IDENTI, TAR_NOMBRE) VALUES(' ||
               :tnIdenti || ',''' || :tcNombre || ''')';

   EXECUTE STATEMENT
      lcComando
   ON EXTERNAL
      'E:\BASESDATOS\CONTABILIDAD.FDB'
   AS
      USER 'SYSDBA' PASSWORD 'masterkey';

END;

En este ejemplo los datos a insertar en la tabla externa fueron enviados como parámetros al stored procedure. Fíjate bien como el parámetro :tcNombre está rodeado por apóstrofos. Debes escribir esos apóstrofos para que funcione.

 Conclusión:

Para poder insertar, modificar o borrar filas en una tabla que se encuentra en otra Base de Datos debemos crear un string y luego ejecutarlo con el comando EXECUTE STATEMENT. Hay que tener en cuenta que las variables de tipo carácter deben estar rodeadas por apóstrofos.

Artículo relacionado:

EXECUTE STATEMENT

Otorgando permisos con EMS SQL Manager

3 comentarios

Como hemos visto en este artículo:

https://firebird21.wordpress.com/2013/05/29/entendiendo-los-derechos-de-acceso/

A los usuarios, a los roles y a los objetos (vistas, triggers, database triggers, stored procedures) se les puede otorgar permisos sobre las tablas y sobre los stored procedures.

Para ello podemos utilizar el programa ISQL (que viene incluido con el Firebird) o algún programa de administración gráfica.

En la imagen de abajo vemos como usaríamos el programa ISQL para ese efecto:

GRANT1

(haciendo clic en la imagen la verás más grande)

Si usamos el programa EMS SQL Manager también podemos otorgar permisos, para ello hacemos clic con el botón derecho sobre el nombre de la tabla o del stored procedure, luego elegimos la opción «Tasks» (tareas) y luego la opción «Grants for table…» como podemos ver en la imagen de abajo:

GRANT2

(haciendo clic en la imagen la verás más grande)

 Y ahora la pantalla cambiará para mostrarnos algo similar a esto:

GRANT3

(haciendo clic en la imagen la verás más grande)

 Para otorgale permisos a un usuario hacemos clic sobre su nombre y luego sobre la operación que le queremos otorgar o sobre las opciones que vemos a la izquierda. Por ejemplo, para otorgarle al usuario «Silvia» el derecho de SELECT sobre la tabla PRODUCTOS haríamos clic allí.

GRANT4

(haciendo clic en la imagen la verás más grande)

Fácilmente podemos saber si el usuario «Silvia» tiene un permiso mirando el color del botón. Si es rojo, no lo tiene.

Para otorgarle todos los permisos podemos hacer clic sucesivamente en cada botón o elegir la opción «Grant all» que se encuentra a la izquierda:

GRANT5

(haciendo clic en la imagen la verás más grande)

Después de hacer clic sobre la opción «Grant all» esto es lo que vemos (todos los colores de los botones han cambiado y también las opciones mostradas a la izquierda han cambiado)

GRANT7

(haciendo clic en la imagen la verás más grande)

Si queremos  quitarle todos los permisos utilizaríamos la opción «Revoke all»

Importante:

Para que la acción de otorgar o de quitar permisos funcione debemos hacer clic sobre la opción «Compile». Recién después de hacer clic sobre «Compile» el usuario tendrá o dejará de tener los permisos.

GRANT6

(haciendo clic en la imagen la verás más grande)

 Resumiendo:

  • Si el botón es de color verde, tiene el permiso
  • Si el botón es de color rojo, no tiene el permiso
  • Para otorgarle todos los permisos podemos hacer clic sobre la opción «Grant all»
  • Para quitarle todos los permisos podemos hacer clic sobre la opción «Revoke all»
  • Si elegimos «with grant option» significa que el usuario puede otorgar ese mismo permiso a otros usuarios
  • Para que el usuario tenga o deje de tener estos permisos debemos hacer clic sobre la opción «Compile»