none
Dúvida com solução para garantir a regra de negócio RRS feed

  • Pergunta

  • Bom dia pessoal,

    Estou com uma dúvida quanto a uma restrição em uma tabela e qual solução utilizar.
    O problema é o seguinte, tenho a tabela abaixo:

    create table ContasAlternativasDebCta(
      IdContaAlternativaDebCta int identity(1,1) not null,
      Empresa char(2) not null,
      Cliente char(15) not null,
      Banco char(4) not null,
      Agencia char(5) not null,
      Conta varchar(17) not null,
      InTipoConta char(1) not null,
      InPreferencial char(1) not null,
      InOrigem char(1) not null,
      DataInclusao smalldatetime not null,
      UsuInclusao char(10) not null,
      VigenciaFinal smalldatetime not null,
      UsuEncerrameto char(10),
      IdRetornoComDebCta int,
      DataAlteracao smalldatetime null,
      UsuAlteracao char(10),
     constraint pk_ContasAlternativasDebCta primary key clustered
    (
      IdContaAlternativaDebCta asc
    )with (pad_index  = off, statistics_norecompute  = off, ignore_dup_key = off, allow_row_locks  = on, allow_page_locks  = on, fillfactor = 85) on [primary]
    ) on [primary]
    go

    Ela tem uma PK e a seguinte UK:

    alter table ContasAlternativasDebCta
      add constraint uk_ContasAlternativasDebCta
      unique (Empresa,Cliente,InPreferencial,Banco,Agencia,Conta,VigenciaFinal)
    go

    Agora o problema:
    O campo InPreferencial refere-se a conta preferencial do cliente, ou seja, ele pode ter N contas, porém somente uma preferencial (tipo S).
    Como posso garantir que o cliente possa ter N contas, porém uma só delas sendo preferencial???

    Pelo que pesquisei na internet, poderia criar uma view e indexar a mesma para garantir a regra, isto procede?
    Ou existe como criar uma Rule ou uma Check Constraint?

    Create View vwContaAlternativa
    as
    select Empresa
          ,Cliente
      from ContasAlternativasDebCta with(nolock)
     where InPreferencial = 'S'
    GO

    Ah, utilizo o SQL Server 2008 R2 Enterprise.

    Obrigado,
    Ronald.

    terça-feira, 12 de março de 2013 12:17

Respostas

  • Ronald, bom dia ! mesmo que voce crie uma view, voce só vai garantir que na visualização da view só mostre o campo  InPreferencial = 'S' mas nas suas tabelas não esta garantindo nada.

    Acredito que o melhor a fazer é somente incluir registros nesta tabela atraves de uma procedure, que quando for inserir um registro de um cliente que ja tenha uma conta e o registro for tentar inserir o campo  InPreferencial = 'S' a procedure faça uma validação se ja existe, dai vai depender da sua regra de negocio se mantem o que ja estava e não colocar o InPreferencial = 'S' ou faz primeiro o update deste campo no registro antigo para inserir o novo...


    Alexandre Matayosi Conde Mauricio. Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    • Marcado como Resposta Ronald Shonuff terça-feira, 12 de março de 2013 16:26
    terça-feira, 12 de março de 2013 12:42
  • Seguindo essa linha de solução, cria um índice único com o indicador e o código do cliente.

    Tks. Fausto Fiorese Branco MCTS, MCITP/DBA 2005 | MCITP/DBA 2008 São Paulo - Brasil * http://www.linkedin.com/in/faustobranco

    • Marcado como Resposta Ronald Shonuff terça-feira, 12 de março de 2013 16:26
    terça-feira, 12 de março de 2013 14:07

Todas as Respostas

  • Ronald, bom dia ! mesmo que voce crie uma view, voce só vai garantir que na visualização da view só mostre o campo  InPreferencial = 'S' mas nas suas tabelas não esta garantindo nada.

    Acredito que o melhor a fazer é somente incluir registros nesta tabela atraves de uma procedure, que quando for inserir um registro de um cliente que ja tenha uma conta e o registro for tentar inserir o campo  InPreferencial = 'S' a procedure faça uma validação se ja existe, dai vai depender da sua regra de negocio se mantem o que ja estava e não colocar o InPreferencial = 'S' ou faz primeiro o update deste campo no registro antigo para inserir o novo...


    Alexandre Matayosi Conde Mauricio. Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    • Marcado como Resposta Ronald Shonuff terça-feira, 12 de março de 2013 16:26
    terça-feira, 12 de março de 2013 12:42
  • Seguindo essa linha de solução, cria um índice único com o indicador e o código do cliente.

    Tks. Fausto Fiorese Branco MCTS, MCITP/DBA 2005 | MCITP/DBA 2008 São Paulo - Brasil * http://www.linkedin.com/in/faustobranco

    • Marcado como Resposta Ronald Shonuff terça-feira, 12 de março de 2013 16:26
    terça-feira, 12 de março de 2013 14:07