Help!! Eliminar registros de SQLServer en .NET

Publicado en 'Programación' por ElAlex, 20 Ago 2010.





  1. ElAlex

    ElAlex Miembro nuevo

    Registro:
    26 Abr 2010
    Mensajes:
    23
    Likes:
    0




    No puedo eliminar un registro que esta siendo utilizado por otra tabla !!
    codigo:

    create table productos(
    prod_cod char(5) primary key,,
    prod_nom varchar(20)
    cat_cod char(5) foreign key references categoria
    );

    create table categoria{
    cat_cod char(5) primary key,
    cat_nom varchar(25)
    }

    Obviamente esto no es mi BD solo pretendo que entren masomenos en contexto. ^ - ^

    Se kiere hacer mantenimiento a la BD, lo que se kiere es eliminar una categoria que ya no se usa.
    Al momento de eliminarlo me indica un error, diciendome que no se puede por que hay una restriccion. ---> Esto sucede porque la categoria que pretendo eliminar esta siendo utilizada por algun producto de mi base de datos.
    Lo borro asi desde un Proc. Alamacenado:
    Create proc usp_EliminaCategoria
    @Codigo char(5)
    as delete from Categoria
    where Cat_Cod=@Codigo
    go
    lo jalo desde el .NET con un sqlCommand

    NO ME DA NINGUN INCONVENIENTE CUANDO NINGUN PRODUCTO ESTA REGISTRADO CON LA CATEGORIA QUE ELIMINO(osea que el codigo elimina sin problemas la categoria elegida siempre y cuando ningun producto pertenesca a esta Categoria, si no es asi me da el error!!)

    ¿En una base de datos real (como las que usan las compañias) como se soluciona esto?
    Cual es la solucion que me plantean ???
    Acepto todo tipo de rspuestas y criticas ya que talvez no deba hacerce asi
     


  2. Yaraher

    Yaraher Miembro maestro

    Registro:
    26 Mar 2007
    Mensajes:
    313
    Likes:
    2
    Asegúrate que no existan constraints que eviten ello e investiga un poco sobre cómo realizar borrados en cascada.

    Ello debería resolver tu problema :)
     
  3. PantherP1nk

    PantherP1nk Miembro nuevo

    Registro:
    2 Ago 2010
    Mensajes:
    18
    Likes:
    0
    Claro no Puedes borrar una categoria pq tiene enlazado un producto, primero tendrias que borrar todos los productos que se relacionen con la categoria en mencion y luego borrar la categoria.

    Lee un poco de relaciones llaves primarias, llaves secundarias, etc. para que te guies mejor.
     
  4. ElAlex

    ElAlex Miembro nuevo

    Registro:
    26 Abr 2010
    Mensajes:
    23
    Likes:
    0
    Obivamente hay una restriccion que no me permite eliminar una clave mientra este en uso. Pero entonces como se hace , nunca se eliminan categorias en una base de datos real. Ojo que categorias es solo un ejemplo.
    Supongamos que quisoera eliminar un producto de una BD de un Supermercado (que tiene como primary key el valor de P001). Este rpoducto no se podria eliminar nunca por siempre estaria utilizado por una tabla "Ventas" que incluye a el valor "P001". O como se haria esto??
    Disculpen si no me expreso bien. XD
     
  5. Charapal[666]

    Charapal[666] Miembro nuevo

    Registro:
    18 Oct 2010
    Mensajes:
    9
    Likes:
    0
    En realidad por el mismo hecho de estar relacionado ya no deberias eliminar ese producto,categoria etc puesto que si te piden reportes en base a esas categorias,productos,etc si lo borras no podras ubicar esa informacion y creo que no es conveniente. Si de todas maneras quieres eliminarlo puedes habilitar el borrado en cascada o en su defecto programar un trigger que antes de borrar el registro te borre los registros seleccionados. Si quieres "simular" una eliminacion podrias ponerle un estado al producto tipo Activo/inactivo los usuarios solo podran ver los productos activos y tu podras hacer tus reportes, consultas etc. espero haberte ayudado.
     
  6. xnla

    xnla Miembro nuevo

    Registro:
    17 Set 2010
    Mensajes:
    12
    Likes:
    0
    si puedes usando trigger de eliminacion en cascada;

    CREATE TRIGGER DelCascada
    ON A
    INSTEAD OF DELETE
    AS
    DELETE FROM B WHERE B.Codigo = (SELECT Codigo FROM Deleted)
    DELETE FROM A WHERE A.Codigo = (SELECT Codigo FROM Deleted)
    GO

    mas o menos ese es el ejemplo que tenia apuntado :p para que funcione tienes que poner instead of delete si o si xD
     
  7. ElAlex

    ElAlex Miembro nuevo

    Registro:
    26 Abr 2010
    Mensajes:
    23
    Likes:
    0
    Genial eso es lo que necesitaba (que me dieran la idea de como hacerlo, por que yo me averiguo lo demas).
    De verdad muchas gracias "Charapa" y muchas gracias "xnla"
     
  8. EruKun

    EruKun Miembro maestro

    Registro:
    15 Nov 2008
    Mensajes:
    254
    Likes:
    10
    para la tabla con referencias es drop table <nombre> cascade constraint(en mysql) nose si funciona en otro lado.
    alter table <nombre> drop column <nombre c>cascade constraint funcionara ?
     
  9. atujpay

    atujpay Miembro maestro

    Registro:
    4 Set 2010
    Mensajes:
    443
    Likes:
    227
    Hola, te aconsejo que mejor le añadas a ambas entidades una columna "estado" (S: habilitado, N: No habilitado), así si no quieres usar / mostrar una categoría pues solo la dejas en estado "no habilitado" y ya.

    Saludos.
     
  10. tenguman

    tenguman Miembro de plata

    Registro:
    15 Nov 2010
    Mensajes:
    3,142
    Likes:
    1,016
    lo que tienes q hacer es modificar las reglas de entidad referencial, la que tienes ahora creo que es la q tiene x defecto, debes indicarle que quieres hacer una eliminacion en cascada... q recuerde tienes q seleccionar la relacion editarla y buscar en el listado de relaciones, expandir uno a uno y ahi encontrara que accion realizara... ojo q me estoy basando en el SQL 2005, eso depende de la BD... y como dicen arriba, es mejor realizar eleiminaciones logicas que fisicas, xq no sabes cuando la vas a cagar :P