Usuário com melhor resposta
Criar constraint

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 SnippetCREATE
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 OFFGO
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 SnippetCREATE
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 OFFGO
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 SnippetCREATE
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 OFFGO
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 SnippetCREATE
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]
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 = @TipoReturn Isnull(@Insert,0)
EndAlter 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 funcionaAbs;
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 = @TipoReturn Isnull(@Insert,0)
EndAlter 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 funcionaAbs;
-
-
Muito bom, consegui fazer, depois de apanhar um pouco, ainda não testei as tabelas estão vazias, ficou assim:
Code SnippetCreate
Function [dbo].[F_RetCli] (@CodigoCli Int)Returns
Intas
Begin
Declare
@RetCodigo IntSelect
@RetCodigo = [Codigo Cliente] From Clientes Where [Codigo Cliente] = @CodigoCliReturn
Isnull(@RetCodigo,0)End
Code SnippetCreate
Function [dbo].[F_RetFor] (@CodigoFor Int)Returns
Intas
Begin
Declare
@RetCodigo IntSelect
@RetCodigo = [Codigo Fornecedor] From Fornecedores Where [Codigo Fornecedor] = @CodigoForReturn
Isnull(@RetCodigo,0)End
Code SnippetALTER
TABLE [dbo].[Movimento] WITH CHECK ADD CONSTRAINT [VerForClie] CHECK (([Dbo].[F_RetFor]([Codigo Instituto])>(0) OR [Dbo].[F_RetCli]([Codigo Instituto])>(0)))