martes, 22 de abril de 2008

CAMPO AUTONUMÉRICO ¿ EDITABLE ?


En este ejemplo veremos como modificar un campo autonumérico para que permita ediciones.

Advertencias previas :
- Esta técnica no funciona en formatos de archivo 2007-2016, pues utiliza la ya desaparecida seguridad por usuario.
- Hoy (22/04/2008), he modificado el complemento 'Editor Sql 1.1' para que admita las instrucciones 'Grant' y 'Revoke'. Por tanto, si has obtenido el Editor en fecha anterior, bájalo de nuevo y vuélvelo a instalar.
- Estas instrucciones solo funcionarán correctamente en bases de datos con formato 2000 y 2003.
- El campo autonumérico efectivamente permitirá ediciones, pero solo desde lenguaje sql.
- En principio, modificar un autonumérico es una mala praxis, pero de todas formas hay ocasiones en que puede ser útil saberlo hacer. Y aquí estamos para eso, para explicar 'cosas raras'.
- Para este ejemplo, se utiliza el usuario 'Admin', que es el usuario predeterminado de Access.

Esta secuencia de instrucciones está pensada para ejecutarla directamente como un nuevo 'Lote', en el 'Editor Sql'. Dado que está profusamente comentada, no añadiré nada más :

/*Ejemplo del uso del permiso UpdateIdentity */

-- Creamos la tabla

Create Table Ejemplo (Id Counter Primary Key, Campo1 Text (255));

-- Insertamos valores de ejemplo
Insert Into Ejemplo (Campo1) Values ("Valor1");
Insert Into Ejemplo (Campo1) Values ("Valor2");
Insert Into Ejemplo (Campo1) Values ("Valor3");
Insert Into Ejemplo (Campo1) Values ("Valor4");
Insert Into Ejemplo (Campo1) Values ("Valor5");

-- Mostramos el contenido de la tabla
Select * From Ejemplo;

-- Eliminamos un registro para crear una discontinuidad
Delete * From Ejemplo Where Id = 3;

-- Iniciamos secuencia para renumerar los valores, y restaurar
-- la continuidad en la serie de valores del campo 'Id'
GRANT UPDATEIDENTITY ON TABLE Ejemplo TO Admin;
Update Ejemplo Set Id = Id - 1 Where Id >= 3;

-- Restauramos los permisos originales
REVOKE UPDATEIDENTITY ON TABLE Ejemplo FROM Admin;

-- Si además, queremos evitar que la inserción de un nuevo registro
-- cree otra discontinuidad (puesto que el siguiente valor para 'Id'
-- será : 6, modificamos el campo 'Id' para que el nuevo valor sea 5 :
Alter Table Ejemplo Alter Column Id Identity (5, 1);

-- Mostramos el contenido de la tabla, renumerada
Select * From Ejemplo;

-- Finalmente, eliminamos la tabla Ejemplo
Drop Table Ejemplo;

Ramon Poch. Terrassa a 22/04/2008.