none
CONSTRAINT CHECK para 2 columnas RRS feed

  • Pregunta

  • Hola a todos,

    Tengo una tabla donde hay una restriccion CHECK con una directiva WITH NOCHECK para una columna (sku_cve), donde por cierta regla de negocio no permite que se inserten caracteres especiales (@"-) en dicho campo; ahora necesitan que dicha restricción sea para 2 columnas (sku_cve, art_tip) ya que habrá ciertos artículos que sí deben llevar caracteres especiales.

    Ésta es la restricción actual:
    ALTER TABLE [CATALOGO]  WITH NOCHECK ADD  CONSTRAINT [ck_val_sku_cve]CHECK  ((NOT [sku_cve] like '%[@"-]%'))

    Entonces agregué una condición más a la restricción y quedó así:

    ALTER TABLE [CATALOGO]  WITH NOCHECK ADD  CONSTRAINT [ck_val_sku_cve]CHECK  ((NOT [sku_cve]  like '%[@"-]%' AND [art_tip]<>'TIPO1'))

    Pero cuando trato de hacer el insert con las nuevas condiciones que deben cumplirse en la regla de negocio, NO respeta la 2° condición y bloquea el insert aunque ART_TIP sea TIPO1.

    Cómo puedo hacer que cuando el usuario inserta nueva información la constraint valide que la columna SKU_CVE sólo permita caracteres especiales como @"- cuando la columna ART_TIP sea TIPO1?.

    Alguna idea?

    Thanks a lot!!!

    JF.


    Jhonatan Francisco.




    • Editado JhonatanWho miércoles, 1 de marzo de 2017 20:55
    martes, 28 de febrero de 2017 16:00

Respuestas

  • JhonatanWho,

    Creo que equivocas la expresión lógica, prueba con la siguiente:

    ALTER TABLE [CATALOGO] WITH NOCHECK 
        ADD  CONSTRAINT [ck_val_sku_cve] CHECK  
    	   ((NOT [sku_cve] LIKE '%[@"-]%' OR [art_tip] = 'TIPO1'));
    GO


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Propuesto como respuesta Joyce_ACModerator jueves, 2 de marzo de 2017 15:30
    • Marcado como respuesta JhonatanWho viernes, 3 de marzo de 2017 14:54
    miércoles, 1 de marzo de 2017 20:57

Todas las respuestas

  • JhonatanWho,

    Lo primero a mencionar es que WITH NOCHECK no es una restricción propiamente dicha (no es parte de las restricciones permitidas en la definición de una tabla) sino que se trata de una directiva que aplica a la restricción CHECK (también aplica a la restricción FOREIGN KEY) que permite configurar la validación previa antes de escribir la restricción. Especificar NO CHECK no es recomendado porque permites que la validación -que especificas en la restricción CHECK- no aplique sobre los datos que ya se encuentran en la tabla.

    ALTER TABLE dbo.CATALOGO_ARTICULOS WITH NOCHECK ADD CONSTRAINT ck_val_sku_cve CHECK
        ((NOT sku_cve LIKE '%[@"-]%' AND Categoria IN ('a', 'b', 'c')) 
        OR (NOT sku_cve LIKE '%[*]%' AND Categoria = 'd'))
    GO

    La regla que escribo en la restricción CHECK no permite insertar/actualizar un valor para la columna [sku_cve] que contenga los caracteres @"- siempre y cuando la categoría sea a, b o c. Si la categoría es d se restringe únicamente -por ejemplo- el carácter *.



    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta JhonatanWho martes, 28 de febrero de 2017 18:27
    • Desmarcado como respuesta JhonatanWho miércoles, 1 de marzo de 2017 19:29
    martes, 28 de febrero de 2017 16:53
  • Hola Williams!

    Muchas gracias por la ayuda.

    Debo mantener el WITH NOCHECK, debido a que existen registros previos que no cumplen con la regla de negocio actual; por lo demás todo está excelente.

    Thanks!!


    Jhonatan Francisco.

    martes, 28 de febrero de 2017 18:27
  • Qué tal Williams?!

    Hice un cambio a la CONSTRAIN y quedó así:

    ALTER TABLE [CATALOGO]  WITH NOCHECK ADD  CONSTRAINT [ck_val_sku_cve]CHECK  ((NOT [sku_cve]  like '%[@"-]%' AND [art_tip]<>'TIPO1'))

    Pero cuando trato de hacer el insert con las nuevas condiciones que deben cumplirse en la regla de negocio, NO respeta la 2° condición y bloquea el insert aunque ART_TIP sea TIPO1.

    Cómo puedo hacer que cuando el usuario inserta nueva información la constraint valide que la columnaSKU_CVE sólo permita caracteres especiales como @"- cuando la columna ART_TIP sea TIPO1?.


    Jhonatan Francisco.

    miércoles, 1 de marzo de 2017 20:43
  • JhonatanWho,

    Creo que equivocas la expresión lógica, prueba con la siguiente:

    ALTER TABLE [CATALOGO] WITH NOCHECK 
        ADD  CONSTRAINT [ck_val_sku_cve] CHECK  
    	   ((NOT [sku_cve] LIKE '%[@"-]%' OR [art_tip] = 'TIPO1'));
    GO


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Propuesto como respuesta Joyce_ACModerator jueves, 2 de marzo de 2017 15:30
    • Marcado como respuesta JhonatanWho viernes, 3 de marzo de 2017 14:54
    miércoles, 1 de marzo de 2017 20:57