PDA

Ver la Versión Completa : Script para actualizar DB en Firebird


Luis M.
18-06-2012, 12:25:51
Hola.
Estoy haciendo pruebas para actualizar una base de datos en Firebird 2.5
Utilizo D2007 y MDO
En un MDOScript pongo lo siguiente:


/* Server version: WI-V6.3.1.26351 Firebird 2.5
SQLDialect: 3. ODS: 11.2. Forced writes: On. Sweep inteval: 20000.
Page size: 4096. Cache pages: 2048 (8192 Kb). Read-only: False. */
SET NAMES ISO8859_1;

SET SQL DIALECT 3;

CONNECT 'Mibase.FDB' USER 'SYSDBA' PASSWORD 'masterkey';

SET AUTODDL ON;

/* Create Domains... */
CREATE DOMAIN PRUEBAS AS VARCHAR(10) COLLATE ES_ES_CI_AI;

/* Create Table... */
CREATE TABLE PRUEBAS(USUARIO USUARIO,
CODIGO PRUEBAS NOT NULL,
FAMILIA FAMILIAS);



/* Create Procedure... */
SET TERM ^ ;

CREATE PROCEDURE ULTIMA_PRUEBA(USUARIO USUARIO)
RETURNS(ULTIMA VARCHAR(10))
AS
BEGIN SUSPEND; END
^


/* Create Primary Key... */
SET TERM ; ^

ALTER TABLE PRUEBAS ADD CONSTRAINT PK_PRUEBAS PRIMARY KEY (USUARIO, CODIGO);

/* Create Foreign Key... */
RECONNECT;

ALTER TABLE PRUEBAS ADD CONSTRAINT FK_PRUEBAS_1 FOREIGN KEY (USUARIO) REFERENCES USUARIOS (CODIGO) ON UPDATE CASCADE ON DELETE CASCADE;

ALTER TABLE PRUEBAS ADD CONSTRAINT FK_PRUEBAS_2 FOREIGN KEY (USUARIO, FAMILIA) REFERENCES FAMILIAS (USUARIO, FAMILIA) ON UPDATE CASCADE;

/* Alter Procedure... */
/* Restore proc. body: ULTIMA_PRUEBA */
SET TERM ^ ;

ALTER PROCEDURE ULTIMA_PRUEBA(USUARIO USUARIO)
RETURNS(ULTIMA VARCHAR(10))
AS
begin
/* Procedure Text */
select max(codigo) from pruebas where usuario = :usuario into :ultima;
suspend;
end
^

/* Alter Procedure... */
SET TERM ; ^

Y lo llamo con MDOScript.ExecuteScript;

El problema es que me sale la ventana para que introduzca el usuario y password.
El usuario pone por defecto SYSDBA y me pide el password.
Si introduzco el password, me funciona perfectamente el Script pero para un sistema de actualización
no creo que sea lo más apropiado.
Como impido que me salga la ventana de usuario y se ejecute el Scrip sin problemas?

Un saludo.

marcoszorrilla
18-06-2012, 16:01:04
Por dar una idea, porque en realidad no me consta que exista en el lenguaje de guiones:LoginPrompt=False, pienso que investigando por este lado pueda salir algo positivo.

Un Saludo.

Casimiro Notevi
18-06-2012, 17:41:33
Te debe de salir un error en el script, ya que no conocterá a la BD. Te falta la palabra "database'

CONNECT 'Mibase.FDB' USER 'SYSDBA' PASSWORD 'masterkey'; /* mal */
connect database 'mibase.fdb' user 'SYSDBA' password 'masterkey'; /* bien */

Luis M.
18-06-2012, 18:32:47
Gracias a los dos por responder.

Después de varias pruebas y opciones, el resultado siempre era el mismo.
Así que opte por cambiar el componente MDOScript por el IBScript y ahora funciona
a la perfección.
Debería de ser cosa del componente.

Te debe de salir un error en el script, ya que no conocterá a la BD. Te falta la palabra "database'

CONNECT 'Mibase.FDB' USER 'SYSDBA' PASSWORD 'masterkey'; /* mal */
connect database 'mibase.fdb' user 'SYSDBA' password 'masterkey'; /* bien */

Casimiro, no me daba ningún error, solo me salia la ventana del login.
El Script estaba echo con database comparer.
Hice otro Script con IBExpert y el resultado era el mismo.
En los dos casos el Script eran iguales exceptuando que el IBExpert añade al final los privilegios.
Funciona igualmente sin el "Database".
Este es el Script echo con IBExpert:

/* Server version: WI-V6.3.1.26351 Firebird 2.5
SQLDialect: 3. ODS: 11.2. Forced writes: On. Sweep inteval: 20000.
Page size: 4096. Cache pages: 2048 (8192 Kb). Read-only: False. */

SET NAMES ISO8859_1;

SET SQL DIALECT 3;

CONNECT 'Mibase.FDB' USER 'SYSDBA' PASSWORD 'masterkey';

SET AUTODDL ON;

/* Create Domains... */
CREATE DOMAIN PRUEBAS AS VARCHAR(10) COLLATE ES_ES_CI_AI;

/* Create Table... */
CREATE TABLE PRUEBAS(USUARIO USUARIO,
CODIGO PRUEBAS NOT NULL,
FAMILIA FAMILIAS);



/* Create Procedure... */
SET TERM ^ ;

CREATE PROCEDURE ULTIMA_PRUEBA(USUARIO USUARIO)
RETURNS(ULTIMA VARCHAR(10))
AS
BEGIN SUSPEND; END
^


/* Create Primary Key... */
SET TERM ; ^

ALTER TABLE PRUEBAS ADD CONSTRAINT PK_PRUEBAS PRIMARY KEY (USUARIO, CODIGO);

/* Create Foreign Key... */
RECONNECT;

ALTER TABLE PRUEBAS ADD CONSTRAINT FK_PRUEBAS_1 FOREIGN KEY (USUARIO) REFERENCES USUARIOS (CODIGO) ON UPDATE CASCADE ON DELETE CASCADE;

ALTER TABLE PRUEBAS ADD CONSTRAINT FK_PRUEBAS_2 FOREIGN KEY (USUARIO, FAMILIA) REFERENCES FAMILIAS (USUARIO, FAMILIA) ON UPDATE CASCADE;

/* Alter Procedure... */
/* Restore proc. body: ULTIMA_PRUEBA */
SET TERM ^ ;

ALTER PROCEDURE ULTIMA_PRUEBA(USUARIO USUARIO)
RETURNS(ULTIMA VARCHAR(10))
AS
begin
/* Procedure Text */
select max(codigo) from pruebas where usuario = :usuario into :ultima;
suspend;
end
^

/* Alter Procedure... */
/* Create(Add) privilege */
SET TERM ; ^

GRANT ALL ON PRUEBAS TO SYSDBA WITH GRANT OPTION;

Un saludo y gracias por vuestra ayuda.