SoloCodigo

Informática en general => Dudas informáticas => Mensaje iniciado por: lencho en Martes 11 de Diciembre de 2007, 03:37

Título: Eliminacion Logica De Tuplas
Publicado por: lencho en Martes 11 de Diciembre de 2007, 03:37
Una pregunta queridos amigos.

He notado que muchos de ustedes es los programas que hacen utilizan la eliminacion logica y no asi la fisico. (es decir lo manejan con estados).

Pues yo tambien estoy utilizando esa misma forma.

Ahora bien, suponiendo que la relacion es entre las tablas: Persona y Pais.

En el formulario donde estan los paises, tengo las opciones de: Adicionar, Modificar, Eliminar (logico), lo cual segun YO, no deberia dejarme eliminar(logico) si es que ese pais ya esta siendo usado por una persona.

Ahora, como podria hacer eso. No se me ocurre nada
Título: Re: Eliminacion Logica De Tuplas
Publicado por: JuanK en Martes 11 de Diciembre de 2007, 03:59
integridad referencial.

es decir cualquier tabal que use ese pais debe tener una llave foranea.

Siempre en una bd si tratas de eliminar una registro y hay datos referenciados (foreign keys ) en otras tablas asocidas nunca te lo dejara borrar.
Título: Re: Eliminacion Logica De Tuplas
Publicado por: lencho en Martes 11 de Diciembre de 2007, 12:25
Cita de: "JuanK"
integridad referencial.

es decir cualquier tabal que use ese pais debe tener una llave foranea.

Siempre en una bd si tratas de eliminar una registro y hay datos referenciados (foreign keys ) en otras tablas asocidas nunca te lo dejara borrar.
Si si.

Por ejemplo, en la tabla persona tengo una columna IDPAIS que es llave foranea a la tabla pais columna IDPAIS.

Tambien en la tabla pais tengo una columna que se llama IDESTADO, la cual es 1 cuando esta activa y 0 cuando la borro (es decir cuando le doy eliminar un pais lo unico que hago es modificar el campo IDESTADO EN 0) para que asi no lo pueda usar mas, pero el problema es. Que pasa con aquellos que ya lo han usado ??.

BYTE
Título: Re: Eliminacion Logica De Tuplas
Publicado por: ElNapster en Martes 11 de Diciembre de 2007, 17:04
Puedes hacer una eliminacion forzada, aunque tengas una integridad referencial puedes utilizar una eliminacion forzada al registro, aunque no muy aconsejable , pero igual se puede hacer  :ph34r:

 :comp:
Título: Re: Eliminacion Logica De Tuplas
Publicado por: lencho en Martes 11 de Diciembre de 2007, 18:45
Citar
Puedes hacer una eliminacion forzada,
Pero lo que pasa es que yo no quiero eliminar las tuplas fisicamente, solo quiero eliminarlas logicamente.

Por ejemplo, si la persona PEPE tiene el pais COLOMBIA asignado, y cuando yo vaya al formulario pais, y trate de eliminar el pais colombia (osea cambiar solamente su estado  en 0), no me permita por el simple echo de que ya hay una persona usando esa nacionalidad.


Gracias.

BYTE.
Título: Re: Eliminacion Logica De Tuplas
Publicado por: ElNapster en Martes 11 de Diciembre de 2007, 19:59
Podrias realizar un Trigger , que te vea si hay registros asociados a ese foreing key , de ser asi que te cambie de primero los estados de los registros y luego el del foreing key   :ph34r:

 :comp:
Título: Re: Eliminacion Logica De Tuplas
Publicado por: lencho en Miércoles 12 de Diciembre de 2007, 01:16
Cita de: "ElNapster"
Podrias realizar un Trigger , que te vea si hay registros asociados a ese foreing key , de ser asi que te cambie de primero los estados de los registros y luego el del foreing key   :ph34r:

 :comp:
umm, pues creo que puede ser una wena idea, pero se me complicaria en el caso de que:

Cuando tablaA, tablaB, tablaC, tablaD, tablaE,....tablaZ.

Y todas ellas tengan un foreign key a la anterior.

Es decir lo de la eliminacion  (logica) en cascada, creo que no me conviene.


Gracias.

Nota. Otra cosa, hablando de trigger, nunca pude hacer uno en SQL Server 2005, Before Update.

BYTE.
Título: Re: Eliminacion Logica De Tuplas
Publicado por: JuanK en Jueves 13 de Diciembre de 2007, 01:44
hola,
nada que hacer lo que necesitas es un triguer.. no se si se pueda en sql server pero deberas trabajar con sql dinamico consuiltando el diccionario de datos.
Título: Re: Eliminacion Logica De Tuplas
Publicado por: lencho en Jueves 13 de Diciembre de 2007, 03:30
Citar
sql dinamico consuiltando el diccionario de datos.
Es significa armar las consultas dinamicamentes ???, pero.... Como ?


Gracias.

Nota.- En el anterior post mencione que nunca pude hacer un trigger BEFORE UPDATED, y por fin pude saber por que.

En Sql server no existe el tiempo (AFTER, BEFORE). Pero se lo puede sustituir con las tablas INSERTED, DELETED.

BYTE.
Título: Re: Eliminacion Logica De Tuplas
Publicado por: F_Tanori en Jueves 13 de Diciembre de 2007, 08:10
Pero lo que harías no es ejecutar un UPDATE ?

ejemplo:

tabla: paises
idPais | Nombre    | Eliminado
---------------------------------------
1        | Colombia   |    N
2        | Guatemala |    N
3        | Bolivia       |    N
4        | Mexico       |   N


tabla: usuarios

idUsuario | Nombre | idPais
------------------------------------
1        | Lencho     |    3
2        | elNapster  |    2
3        | Juank       |    1
4        | Ftanori      |    4

----------------------------------------------------------------------------------------------
no soy muy diestro en SQL Server pero en MySQL seria algo mas o menos asi
utilizando Exists (Not Exists) tambien es posible utilizar IN ....


<!--sql--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>SQL </td></tr><tr><td id='CODE'><!--sql1-->@pais=4

[color=blue;font-weight]UPDATE[/color] paises SET eliminado='S'  WHERE not exists ([color=blue;font-weight]select[/color] 1 from usuarios u where u.idPais=p.idPais ) and idPais=@pais ;
<!--sql2--></td></tr></table><div class='postcolor'><!--sql3-->


habría que ver como se hace en SQL Server y crear el SP o el metodo desde el lenguaje utilizado pudiendo retornar  " rows affected " no se como se haga en SQL Server :P

No se si eso te sirva, pero pude ser una idea

Saludos
Título: Re: Eliminacion Logica De Tuplas
Publicado por: lencho en Jueves 13 de Diciembre de 2007, 23:39
Muchas gracias por la idea.

Pero..., siendo de esta forma (en el mejor de los casos, solo revisar una relacion)
<!--sql--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>SQL </td></tr><tr><td id='CODE'><!--sql1-->[color=blue;font-weight]UPDATE[/color] paises SET eliminado='S' WHERE not exists ([color=blue;font-weight]select[/color] 1 from usuarios u where u.idPais=p.idPais ) and idPais=@pais ;
<!--sql2--></td></tr></table><div class='postcolor'><!--sql3-->

Y si ademas de Persona, la tabla Pais, se relaciona con Departamento, Continente, Planeta (POR DECIR !!)

Tendria que hacer..
<!--sql--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>SQL </td></tr><tr><td id='CODE'><!--sql1-->[color=blue;font-weight]UPDATE[/color] paises
SET eliminado='S'
WHERE idPais=@pais and not exists ([color=blue;font-weight]select[/color] 1 from usuarios u where u.idPais=p.idPais ) and not exists ([color=blue;font-weight]select[/color] 1 from Departamento d where d.idPais=p.idPais ) and not exists ([color=blue;font-weight]select[/color] 1 from Continente c where c.idPais=p.idPais ) and not exists ([color=blue;font-weight]select[/color] 1 from Planeta pl where pl.idPais=p.idPais )
<!--sql2--></td></tr></table><div class='postcolor'><!--sql3-->

Por lo tanto cada vez que aumente una llave foranea a esta tabla pais, tendria que aumentar UN AND MAS el trigger anterior.
Y yo pense si no existe alguna funcion, que me puedad ayudar a obtener las llaves que tiene una determinada tabla y asi poder hacerlo automatico.


Gracias.


BYTE.
Título: Re: Eliminacion Logica De Tuplas
Publicado por: F_Tanori en Sábado 15 de Diciembre de 2007, 10:52
Ok, no habia entendido que se extenderian las relaciones :P

pues como dice JuanK pudieras revisar las tablas del sistema con un query apropiada sacar las relaciones....


Otra opcion seria utilizar transacciones  :rolleyes: eliminando el registro y comprobando si se elimina tomando las filas afectadas o el error (claro utilizando integridad referencial como ya se comento) para saber es posible eliminar dicho registro

despues de hacer esa comprobacion ejecutar el Rollback, y hacer el UPDATE para la eliminacion LOGICA


No se que tan fuera de mis casillas este con esa idea :P pero es una opcion



Saludos
Título: Re: Eliminacion Logica De Tuplas
Publicado por: JuanK en Sábado 15 de Diciembre de 2007, 15:31
Cita de: "F_Tanori"
No se que tan fuera de mis casillas este con esa idea :P pero es una opcion
 
podria ser buena salvo en el caso que se eliminaron bastantes registros,por demas decir que hay un esfuerzo transaccional amplio o pbueno puee que no mucho :S



Saludos.
Título: Re: Eliminacion Logica De Tuplas
Publicado por: lencho en Sábado 15 de Diciembre de 2007, 23:32
Ajaaaa.

Me parece muy wena la idea.

Tratare de aplicarla.

Muchas gracias.


BYTE.