3ENGINE

Programación y otros cachivaches

Etiqueta: SQL

Página 2/4

Tecnologia

«Cannot load IDAPI service library» File: NTWDBLIB.DLL


Si cuando intentas conectar a una base de datos SQL Server aparece un error del estilo «Cannot load IDAPI service library» File: NTWDBLIB.DLL

NTWDBLIB.DLL

… y tienes un Windows 7, necesitarás copiar tres archivos (ntwdblib.dll, MSVCP71.DLL y msvcr71.dll) en la carpeta Windows/System32 o Windows/SysWOW64 si tu sistema operativo es de 64 bits.

Enlace a los tres archivos.




Tecnologia

Access 2010: solución al error «You do not have exclusive access to the database at this time»


Al trabajar con Access 2010 puede aparece un mensaje de error You do not have exclusive access to the database all this time como este:

You do not have exclusive access to the database at this time

Pero el problema es que este mensaje de error a veces se produce incluso aunque haya un único usuario en la base de datos. Para resolver este error te propongo dos posibles soluciones.

Solución 1

Ir al apartado Configuración del Cliente (Client Settings) dentro del Opciones (Access Options) y en la sección Avanzadas (Advanced) seleccionar el modo Compartido (Shared):

You do not have exclusive access to the database at this time

Solución 2

Si la primera solución no fue efectiva o ya tenias seleccionado el modo compartido. Entonces es posible que tu base de datos Access esté corrompida. Para intentar recuperar lo que haremos es importar la base de datos a una nueva base de datos Access en blanco:

Primero crear una base de datos en blanco, vete a la pestaña Datos Externos (External Data) y selecciona la opción de importar de una base de datos Access:

You do not have exclusive access to the database at this time

Selecciona la base de datos que da problemas:

You do not have exclusive access to the database at this time

Y por último importa todos los objetos:

You do not have exclusive access to the database at this time

 




Tecnologia

Oracle. Cómo añadir un nuevo campo autoincremental a una tabla existente e indexarlo.


Supongamos un caso hipotético. Tenemos una tabla usuarios con un mal diseño donde el campo nombre es la clave única:

CREATE TABLE MYUSERS
(
  NOMBRE   VARCHAR2 (50) NOT NULL,
  APELLIDO VARCHAR2 (50) NOT NULL,
  CONSTRAINT PK_MYUSERS PRIMARY KEY (NOMBRE)
);

La poblamos de datos de ejemplo:

INSERT INTO MYUSERS (NOMBRE, APELLIDO) VALUES ('Rafael','Sanchez');
INSERT INTO MYUSERS (NOMBRE, APELLIDO) VALUES ('Daniel','Rodriguez');
INSERT INTO MYUSERS (NOMBRE, APELLIDO) VALUES ('Rodolfo','Martínez');
INSERT INTO MYUSERS (NOMBRE, APELLIDO) VALUES ('Sebastian','López');
INSERT INTO MYUSERS (NOMBRE, APELLIDO) VALUES ('Laura','Martí');
INSERT INTO MYUSERS (NOMBRE, APELLIDO) VALUES ('Sergio','Casas');

Y se decide añadir un campo numérico autoincremental que será la nueva clave única.

Pasos:

1. Crear secuencia INCMYUSERS
2. Eliminar primary key PK_MYUSERS
3. Añadir nuevo campo ID_MYUSERS y que permita valores nulos.
4. Asignar un valor incremental al nuevo campo para cada uno de los registros ya existentes.
5. Modificar el campo ID_MYUSERS para que no permita nulos.
6. Crear nueva primary key PK_MYUSERS

Script:

-- crear secuencia
CREATE SEQUENCE INCMYUSERS INCREMENT BY 1 NOMINVALUE NOMAXVALUE NOCYCLE NOORDER CACHE 20; 
-- eliminar primary key
ALTER TABLE MYUSERS DROP CONSTRAINT PK_MYUSERS;
-- añadir nueva columna 
ALTER TABLE MYUSERS ADD ID_MYUSERS NUMERIC(10);
--dar un valor incremental
DECLARE
CURSOR MYUSERS_CUR IS
  SELECT * FROM MYUSERS
  FOR UPDATE OF ID_MYUSERS;
BEGIN
    FOR MYUSERS_REC IN MYUSERS_CUR
    LOOP
    UPDATE IMPORT
      SET    ID_MYUSERS = INCMYUSERS.NEXTVAL
      WHERE  CURRENT OF MYUSERS_CUR;
    END LOOP;
END;
-- ahora la nueva columna no puede ser nula
ALTER TABLE MYUSERS MODIFY ID_MYUSERS NUMERIC(10) NOT NULL; 
-- crear nueva primary key 
ALTER TABLE MYUSERS ADD CONSTRAINT PK_MYUSERS PRIMARY KEY (ID_MYUSERS);

Resultado:




Tecnologia

Sleep en Oracle


Si necesitas un delay, por ejemplo, dentro de un Store Procedure puedes hacer uso de sleep:

dbms_lock.sleep
user_lock.sleep

Pero si tienes restringida la ejecución de este SP, este trozo de código emula un delay de una segundo:

DECLARE t1 DATE;
 t2 DATE;
BEGIN t1 := SYSDATE + 1 / 24 / 60 / 60;
  LOOP t2 := SYSDATE;
 EXIT WHEN t2 >= t1;
 END LOOP;
END;