Usuário com melhor resposta
1-Desempenho, qual é melhor? 2-Constraint validando atraves de outra coluna, é possivel?

Pergunta
-
Ola
tenho um seguinte problema
tenho as seguintes tabelas (as escrevi de forma reduzida)
table TBDebito (
DbtID INT
)
table TBCheque(
ChqID
)
table TBSaque (
SqeID
)
table TBDebitoCheque(
DbtID
ChqID
)
table TBDebitoSaque(
DbtID
SqeID
)
porem, eu nao posso permitir o pagamento de um debito ocorra de 2 formas (cheque, saque)
eu verifico se ouve o pagamento numa das tabelas como forma de validacao, porem nao acho isso a forma mais correta, mais nao encontrei outra forma, queria fazer isso por constraint, alguem pode me dar outra solucao?
uma outra forma que pensei em fazer é
table TBDebito (
DbtID INT
)
table TBCheque(
ChqID
)
table TBSaque (
SqeID
)
table TBDebitoPagamento(
DbtID
ChqID
SqeID
)
sobre essa 2 opcao
qual é a mais correta em relacao a desempenho, logica, escabilidade entre outras coisas
tentei criar uma constraint dessa forma
IF ChqID = 0
BEGIN
SqeID > 0
END
porem nao consegui
existe como eu criar uma constraint tento como referencia outra coluna da tabela?
alguem tem alguma ideia que possa ajudar, sera bem vinda
T+
Falow
Respostas
-
uma maneira de criar uma constraint utilizando uma coluna de outra tabela seria fazer uma funcao que retorne 0 ou 1 assim vc. faz a comparacao na contraint, agora quando a performance sempre que usar operadores = eles sao melhores que o <> ou > < .
Abs;
-
-
Marcelo
Veja como ficou a solução
--CRIO A TABELA
CREATE TABLE dbo.TBDbt(
DbtID INT NULL,
ChqID INT NULL,
SqeID INT NULL,
CONSTRAINT PK_TBDbt PRIMARY KEY
)
GO
--CRIO A FUNCAO PARA VALIDAR
CREATE FUNCTION FCDbtConstraint(
@DbtID INT)
RETURNS TINYINT
AS
BEGIN
DECLARE
@ChqID TINYINT,
@Retorno TINYINT
SELECT @ChqID = ChqID FROM TBDbt
WHERE DbtID = @DbtID AND SqeID = 0 AND ChqID <> 0
IF EXISTS (SELECT ChqID FROM TBDbt WHERE DbtID = @DbtID AND SqeID <> 0 AND ChqID <> 0)
BEGIN
SET @Retorno = 1
END
ELSE
BEGIN
SET @Retorno = 0
END
RETURN @Retorno
END
GO
--ADICIONO A CONSTRAINT
ALTER TABLE dbo.TBDbt WITH CHECK
ADD CONSTRAINT CK_TBDbt_Chq_Sqe CHECK ((dbo.FCDbtConstraint(DbtID)=(0)))
GO
--INSIRO DADOS PARA TESTAR
INSERT INTO TBDbt VALUES (1,1,0)
INSERT INTO TBDbt VALUES (2,0,1)
INSERT INTO TBDbt VALUES (3,1,1)--Erro, nao permite
INSERT INTO TBDbt VALUES (4,2,0)
INSERT INTO TBDbt VALUES (5,0,4)
INSERT INTO TBDbt VALUES (6,7,0)
INSERT INTO TBDbt VALUES (7,0,9)
INSERT INTO TBDbt VALUES (8,9,5)--Erro, nao permite
INSERT INTO TBDbt VALUES (9,8,6)--Erro, nao permite
e novamente
Obrigado pela ajuda
T+
Todas as Respostas
-
uma maneira de criar uma constraint utilizando uma coluna de outra tabela seria fazer uma funcao que retorne 0 ou 1 assim vc. faz a comparacao na contraint, agora quando a performance sempre que usar operadores = eles sao melhores que o <> ou > < .
Abs;
-
Ola marcelo
mais quando disse a respeito de performance e manutencao foi em relaca a trocar as 2 tabelas separadas por apenas uma tabela, contendo o Debito,Cheque e Saque
mais ou meno isso
trocar essa logica
table TBDebitoCheque(
DbtID
ChqID
)
table TBDebitoSaque(
DbtID
SqeID
)
Por essa
TABLE TBDebitoEPagamento(
DbtID
ChqID
SqeID
)
em resumo, unir as 2 tabelas
nesse caso, qual seria melhor?
falow
e obrigado -
-
-
Marcelo
Veja como ficou a solução
--CRIO A TABELA
CREATE TABLE dbo.TBDbt(
DbtID INT NULL,
ChqID INT NULL,
SqeID INT NULL,
CONSTRAINT PK_TBDbt PRIMARY KEY
)
GO
--CRIO A FUNCAO PARA VALIDAR
CREATE FUNCTION FCDbtConstraint(
@DbtID INT)
RETURNS TINYINT
AS
BEGIN
DECLARE
@ChqID TINYINT,
@Retorno TINYINT
SELECT @ChqID = ChqID FROM TBDbt
WHERE DbtID = @DbtID AND SqeID = 0 AND ChqID <> 0
IF EXISTS (SELECT ChqID FROM TBDbt WHERE DbtID = @DbtID AND SqeID <> 0 AND ChqID <> 0)
BEGIN
SET @Retorno = 1
END
ELSE
BEGIN
SET @Retorno = 0
END
RETURN @Retorno
END
GO
--ADICIONO A CONSTRAINT
ALTER TABLE dbo.TBDbt WITH CHECK
ADD CONSTRAINT CK_TBDbt_Chq_Sqe CHECK ((dbo.FCDbtConstraint(DbtID)=(0)))
GO
--INSIRO DADOS PARA TESTAR
INSERT INTO TBDbt VALUES (1,1,0)
INSERT INTO TBDbt VALUES (2,0,1)
INSERT INTO TBDbt VALUES (3,1,1)--Erro, nao permite
INSERT INTO TBDbt VALUES (4,2,0)
INSERT INTO TBDbt VALUES (5,0,4)
INSERT INTO TBDbt VALUES (6,7,0)
INSERT INTO TBDbt VALUES (7,0,9)
INSERT INTO TBDbt VALUES (8,9,5)--Erro, nao permite
INSERT INTO TBDbt VALUES (9,8,6)--Erro, nao permite
e novamente
Obrigado pela ajuda
T+