SoloCodigo
Informática en general => Dudas informáticas => Mensaje iniciado 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
-
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.
-
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
-
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:
-
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.
-
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:
-
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.
-
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.
-
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.
-
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
-
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.
-
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
-
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.
-
Ajaaaa.
Me parece muy wena la idea.
Tratare de aplicarla.
Muchas gracias.
BYTE.