none
Validar antes de DELETE RRS feed

  • Pregunta

  • Estimados.

    Tengo 2 casos,

    1.- Una tabla donde NO se deberia poder eliminar los registros que tengan estado = 1

    2.- Una tabla que NO se debería poder eliminar si la tabla detalle tiene datos.

    Que me recomiendan para poder validar que no se pueda eliminar en estas tablas ? Habia pensado en Triggers

    Saludos.


    DBA SQL Server Santiago/Chile

    martes, 5 de septiembre de 2017 13:09

Respuestas

  • Que version de SQL Server usas?

    Solo en las primeras versiones se permitia un unico trigger por accion, pero esa restriccion ya no prevalece.

    Ejemplo:

    CREATE TABLE dbo.Test (
    col1 int
    );
    GO
    CREATE TRIGGER dbo.tr_T1 ON dbo.Test FOR DELETE
    AS
    SET NOCOUNT ON;
    GO
    CREATE TRIGGER dbo.tr_T2 ON dbo.Test FOR DELETE
    AS
    SET NOCOUNT ON;
    GO
    DROP TABLE dbo.Test
    GO


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas

    • Propuesto como respuesta Willams Morales martes, 5 de septiembre de 2017 17:35
    • Marcado como respuesta Moderador M martes, 12 de septiembre de 2017 22:21
    martes, 5 de septiembre de 2017 14:53
  • puedo tener mas de un trigger sobre el DELETE, entiendo que no o estoy en un error

    Sí, en todas las versiones recientes de SQL Server se puede poner más de un trigger de tipo AFTER sobre una misma tabla (es decir, puedes tener varios AFTER DELETE, varios AFTER INSERT y varios AFTER UPDATE). No se puede tener más de uno si es de tipo INSTEAD OF.

    • Propuesto como respuesta Willams Morales martes, 5 de septiembre de 2017 17:35
    • Marcado como respuesta Moderador M martes, 12 de septiembre de 2017 22:21
    martes, 5 de septiembre de 2017 16:46

Todas las respuestas

  • Usar trigger puede ayudar a resolver ambos pero te recomiendo que trates de usar restricciones declarativas si es posible.

    2.- Una tabla que NO se debería poder eliminar si la tabla detalle tiene datos.

    Cual es la relacion entre ambas tablas?


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas

    • Propuesto como respuesta Willams Morales martes, 5 de septiembre de 2017 17:34
    martes, 5 de septiembre de 2017 13:24
  • Para el caso 1, you sugeriría un trigger "after delete" que haga un ROLLBACK si la pseudo'tabla "deleted" contiene algún registro con estado=1.

    Para el caso 2, si la tabla detalle tiene bien puesto el Foreign Key con la tabla maestra, basta con que el Foreign Key esté configurado con ON DELETE NO ACTION (que es el vaor predeterminado) y con eso es suficiente para que no deje borrar en la tabla madre si tiene registros relacionados en la tabla hija.

    • Propuesto como respuesta Willams Morales martes, 5 de septiembre de 2017 17:34
    martes, 5 de septiembre de 2017 13:37
  • Hola.

    Para el caso 1 esta claro, mil gracias.

    Para el caso 2 efectivamente lo tengo con FK por el ID correspondiente, solo quería estar seguro que lo estaba aplicando correctamente.

    Me surge otra duda, puedo tener mas de un trigger sobre el DELETE, entiendo que no o estoy en un error.


    DBA SQL Server Santiago/Chile

    martes, 5 de septiembre de 2017 14:27
  • Que version de SQL Server usas?

    Solo en las primeras versiones se permitia un unico trigger por accion, pero esa restriccion ya no prevalece.

    Ejemplo:

    CREATE TABLE dbo.Test (
    col1 int
    );
    GO
    CREATE TRIGGER dbo.tr_T1 ON dbo.Test FOR DELETE
    AS
    SET NOCOUNT ON;
    GO
    CREATE TRIGGER dbo.tr_T2 ON dbo.Test FOR DELETE
    AS
    SET NOCOUNT ON;
    GO
    DROP TABLE dbo.Test
    GO


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas

    • Propuesto como respuesta Willams Morales martes, 5 de septiembre de 2017 17:35
    • Marcado como respuesta Moderador M martes, 12 de septiembre de 2017 22:21
    martes, 5 de septiembre de 2017 14:53
  • puedo tener mas de un trigger sobre el DELETE, entiendo que no o estoy en un error

    Sí, en todas las versiones recientes de SQL Server se puede poner más de un trigger de tipo AFTER sobre una misma tabla (es decir, puedes tener varios AFTER DELETE, varios AFTER INSERT y varios AFTER UPDATE). No se puede tener más de uno si es de tipo INSTEAD OF.

    • Propuesto como respuesta Willams Morales martes, 5 de septiembre de 2017 17:35
    • Marcado como respuesta Moderador M martes, 12 de septiembre de 2017 22:21
    martes, 5 de septiembre de 2017 16:46
  • Hola

    Concuerdo con lo comentado por @Alberto, debes configurar las relaciones entre tablas para no eliminar en cascada, revisa este enlace.

    Restricciones de integridad referencial en cascada

    Saludos


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú


    • Editado Pedro Ávila martes, 5 de septiembre de 2017 16:50
    martes, 5 de septiembre de 2017 16:50