none
Criar constraint RRS feed

  • Pergunta

  • Tenho 3 tabelas com algumas constraints que criei usando relation, no entanto preciso criar uma constraint na tabela Movimento que verifique se existe um código de fornecedor ou de cliente, verificando ainda o tipo de instituto através do campo [Codigo Tipo Instituto]

    Seria algo como:

    [Codigo Tipo Instituto] = [Codigo Tipo Instituto] and ([Codigo Instituicao] = [Codigo Cliente] or [Codigo Instituicao] = [Codigo Fornecedor])

     

    Como eu poderia criar essa constraint ?

    Abaixo os scripts das tabelas.

     

    Code Snippet

    CREATE TABLE [dbo].[Movimento](

    [Contador Movimento] [int] IDENTITY(1,1) NOT NULL,

    [Data Movimento] [datetime] NOT NULL CONSTRAINT [DF_Movimento_Data Movimento] DEFAULT (getdate()),

    [Codigo Tipo Instituto] [smallint] NOT NULL,

    [Codigo Instituicao] [int] NOT NULL,

    [Codigo Grupo Bem] [int] NOT NULL,

    [Codigo Bem] [bigint] NOT NULL,

    [Valor Movimento] [decimal](18, 2) NOT NULL,

    [Valor Anterior Moviemento] [decimal](18, 2) NOT NULL,

    [Valor Saldo Movimento] [decimal](18, 2) NOT NULL,

    [Observacao Movimento] [varchar](max) COLLATE Latin1_General_CI_AS NULL,

    CONSTRAINT [PK_Movimento] PRIMARY KEY CLUSTERED

    (

    [Contador Movimento] ASC

    )WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]

    ) ON [PRIMARY]

    GO

    SET ANSI_PADDING OFF

    GO

    ALTER TABLE [dbo].[Movimento] WITH CHECK ADD CONSTRAINT [FK_Movimento_Bens] FOREIGN KEY([Codigo Bem])

    REFERENCES [dbo].[Bens] ([Codigo Bem])

    GO

    ALTER TABLE [dbo].[Movimento] CHECK CONSTRAINT [FK_Movimento_Bens]

    GO

    ALTER TABLE [dbo].[Movimento] WITH CHECK ADD CONSTRAINT [FK_Movimento_Tipo Instituto] FOREIGN KEY([Codigo Tipo Instituto])

    REFERENCES [dbo].[Tipo Instituto] ([Codigo Tipo Instituto])

    GO

    ALTER TABLE [dbo].[Movimento] CHECK CONSTRAINT [FK_Movimento_Tipo Instituto]

     

     

    Code Snippet

    CREATE TABLE [dbo].[Clientes](

    [Codigo Cliente] [int] NOT NULL,

    [Nome Cliente] [varchar](50) COLLATE Latin1_General_CI_AS NOT NULL,

    [Codigo Tipo Instituto] [smallint] NOT NULL

    ) ON [PRIMARY]

    GO

    SET ANSI_PADDING OFF

    GO

    ALTER TABLE [dbo].[Clientes] WITH CHECK ADD CONSTRAINT [FK_Clientes_Tipo Instituto] FOREIGN KEY([Codigo Tipo Instituto])

    REFERENCES [dbo].[Tipo Instituto] ([Codigo Tipo Instituto])

    GO

    ALTER TABLE [dbo].[Clientes] CHECK CONSTRAINT [FK_Clientes_Tipo Instituto]

     

    Code Snippet

    CREATE TABLE [dbo].[Fornecedores](

    [Codigo Fornecedor] [int] IDENTITY(1,1) NOT NULL,

    [Nome Fornecedor] [varchar](50) COLLATE Latin1_General_CI_AS NOT NULL,

    [Codigo Tipo Instituto] [smallint] NOT NULL

    ) ON [PRIMARY]

    GO

    SET ANSI_PADDING OFF

    GO

    ALTER TABLE [dbo].[Fornecedores] WITH CHECK ADD CONSTRAINT [FK_Fornecedores_Tipo Instituto] FOREIGN KEY([Codigo Tipo Instituto])

    REFERENCES [dbo].[Tipo Instituto] ([Codigo Tipo Instituto])

    GO

    ALTER TABLE [dbo].[Fornecedores] CHECK CONSTRAINT [FK_Fornecedores_Tipo Instituto]

     

    Code Snippet

    CREATE TABLE [dbo].[Tipo Instituto](

    [Codigo Tipo Instituto] [smallint] IDENTITY(1,1) NOT NULL,

    [Descricao Tipo Instituto] [varchar](30) COLLATE Latin1_General_CI_AS NOT NULL,

    CONSTRAINT [PK_Tipo Instituto] PRIMARY KEY CLUSTERED

    (

    [Codigo Tipo Instituto] ASC

    )WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]

    ) ON [PRIMARY]

     

    terça-feira, 3 de julho de 2007 11:37

Respostas

  •  

     

     Acho melhor neste caso criar uma constraint de chek assim vc. pode fazer uma funcao e analisar o retorno veja esse exemplo:

     

     

     

    Create Table Exemplo (Codigo int identity(1,1), Nome Varchar(10), Tipo int)

    Create Table ExemploTipos (Tipo int)

    Insert into ExemploTipos (Tipo) Values (1)
    Insert into ExemploTipos (Tipo) Values (2)

    Create Function RetTipo (@Tipo Int)
    Returns Int
    as
    Begin
    Declare @Insert Int
    Select @Insert = Tipo From EXemploTipos Where Tipo = @Tipo

    Return Isnull(@Insert,0)
    End

    Alter Table Exemplo With Check Add Constraint VerTipo Check ( Dbo.RetTipo(Tipo) > 0 )


    Insert into Exemplo ( nome, tipo) Values ('joao', 1) -- funciona
    Insert into Exemplo ( nome, tipo) Values ('joao', 3) -- nao funciona

     

    Abs;

    terça-feira, 3 de julho de 2007 12:06

Todas as Respostas

  •  

     

     Acho melhor neste caso criar uma constraint de chek assim vc. pode fazer uma funcao e analisar o retorno veja esse exemplo:

     

     

     

    Create Table Exemplo (Codigo int identity(1,1), Nome Varchar(10), Tipo int)

    Create Table ExemploTipos (Tipo int)

    Insert into ExemploTipos (Tipo) Values (1)
    Insert into ExemploTipos (Tipo) Values (2)

    Create Function RetTipo (@Tipo Int)
    Returns Int
    as
    Begin
    Declare @Insert Int
    Select @Insert = Tipo From EXemploTipos Where Tipo = @Tipo

    Return Isnull(@Insert,0)
    End

    Alter Table Exemplo With Check Add Constraint VerTipo Check ( Dbo.RetTipo(Tipo) > 0 )


    Insert into Exemplo ( nome, tipo) Values ('joao', 1) -- funciona
    Insert into Exemplo ( nome, tipo) Values ('joao', 3) -- nao funciona

     

    Abs;

    terça-feira, 3 de julho de 2007 12:06
  • Marcelo,

     

    Muito bom o seu exemplo.

     

    Parabéns!!!

    terça-feira, 3 de julho de 2007 12:12
  • Muito bom, consegui fazer, depois de apanhar um pouco, ainda não testei as tabelas estão vazias, ficou assim:

     

    Code Snippet

    Create Function [dbo].[F_RetCli] (@CodigoCli Int)

    Returns Int

    as

    Begin

    Declare @RetCodigo Int

    Select @RetCodigo = [Codigo Cliente] From Clientes Where [Codigo Cliente] = @CodigoCli

    Return Isnull(@RetCodigo,0)

    End

     

    Code Snippet

    Create Function [dbo].[F_RetFor] (@CodigoFor Int)

    Returns Int

    as

    Begin

    Declare @RetCodigo Int

    Select @RetCodigo = [Codigo Fornecedor] From Fornecedores Where [Codigo Fornecedor] = @CodigoFor

    Return Isnull(@RetCodigo,0)

    End

    Code Snippet

    ALTER TABLE [dbo].[Movimento] WITH CHECK ADD CONSTRAINT [VerForClie] CHECK (([Dbo].[F_RetFor]([Codigo Instituto])>(0) OR [Dbo].[F_RetCli]([Codigo Instituto])>(0)))

     

    terça-feira, 3 de julho de 2007 12:53