none
Validar ingreso de datos RRS feed

  • Pregunta

  • Hola.

    Tengo 2 tablas.

    Una de ellas tiene los valores 1,2,3,4 (Estos datos pueden ir variando en el tiempo)

    La otra necesito que solo acepte valores de la anterior, entonces si ingreso 5 necesito que de error.

    No puedo hacer FK.

    Puede ser con constaint ? como ? o bien deberia ser con Trigger ?



    DBA SQL Server Santiago/Chile

    jueves, 14 de julio de 2016 17:24

Respuestas

  • Seria algo asi

    CREATE FUNCTION testRelacion (@Number INT)
    RETURNS int
    AS
    BEGIN
    
    IF @Number = 1 or @Number = 2 or @Number = 3 or @Number = 4
    	RETURN 1
    
    RETURN 0
    END
    GO 
    CREATE TABLE [dbo].[TEST1](
    	[PRUEBA] [int] NULL
    ) ON [PRIMARY]
    
    GO

    ALTER TABLE [dbo].[TEST1]
      ADD CONSTRAINT TEST_RELACION
      CHECK ([dbo].[testRelacion]([PRUEBA]) = 1); 




    Carlos Ignacio Aguero. DBA SQL Server. Toda mi respeto al pueblo Peruano por la ayuda prestada en la guerra de Malvinas.

    • Propuesto como respuesta José De Alva miércoles, 20 de julio de 2016 22:32
    • Marcado como respuesta José De Alva lunes, 25 de julio de 2016 16:18
    jueves, 14 de julio de 2016 17:50
  • CMAPM,

    ¿Cuál es el contexto del requerimiento? ¿Las inserciones se hacen únicamente por base de datos? ¿Se hacen desde una aplicación? La propuesta de Carlos me parece adecuada sin embargo entiendo que podría afectar al rendimiento (en caso yo esté equivocado me lo hacen notar), creo lo mejor es restringir desde la inserción, pero, por eso es importante el contexto de tu requerimiento:

    DECLARE @Campo1 int = 10;
    DECLARE @Campo2 int = 20;
    INSERT INTO Tabla2 (Campo1, Campo2)
    VALUES
    (
    	@Campo1,
    	@Campo2
    )
    WHERE
    	EXISTS (SELECT 1 FROM Tabla1 WHERE (Campo1 = @Campo1));


    • Propuesto como respuesta José De Alva miércoles, 20 de julio de 2016 22:32
    • Marcado como respuesta José De Alva lunes, 25 de julio de 2016 16:18
    jueves, 14 de julio de 2016 18:09

Todas las respuestas

  • Seria algo asi

    CREATE FUNCTION testRelacion (@Number INT)
    RETURNS int
    AS
    BEGIN
    
    IF @Number = 1 or @Number = 2 or @Number = 3 or @Number = 4
    	RETURN 1
    
    RETURN 0
    END
    GO 
    CREATE TABLE [dbo].[TEST1](
    	[PRUEBA] [int] NULL
    ) ON [PRIMARY]
    
    GO

    ALTER TABLE [dbo].[TEST1]
      ADD CONSTRAINT TEST_RELACION
      CHECK ([dbo].[testRelacion]([PRUEBA]) = 1); 




    Carlos Ignacio Aguero. DBA SQL Server. Toda mi respeto al pueblo Peruano por la ayuda prestada en la guerra de Malvinas.

    • Propuesto como respuesta José De Alva miércoles, 20 de julio de 2016 22:32
    • Marcado como respuesta José De Alva lunes, 25 de julio de 2016 16:18
    jueves, 14 de julio de 2016 17:50
  • CMAPM,

    ¿Cuál es el contexto del requerimiento? ¿Las inserciones se hacen únicamente por base de datos? ¿Se hacen desde una aplicación? La propuesta de Carlos me parece adecuada sin embargo entiendo que podría afectar al rendimiento (en caso yo esté equivocado me lo hacen notar), creo lo mejor es restringir desde la inserción, pero, por eso es importante el contexto de tu requerimiento:

    DECLARE @Campo1 int = 10;
    DECLARE @Campo2 int = 20;
    INSERT INTO Tabla2 (Campo1, Campo2)
    VALUES
    (
    	@Campo1,
    	@Campo2
    )
    WHERE
    	EXISTS (SELECT 1 FROM Tabla1 WHERE (Campo1 = @Campo1));


    • Propuesto como respuesta José De Alva miércoles, 20 de julio de 2016 22:32
    • Marcado como respuesta José De Alva lunes, 25 de julio de 2016 16:18
    jueves, 14 de julio de 2016 18:09