none
Trigger Com incremento RRS feed

  • Pergunta

  • Boa tarde!

    Sou novo por aqui, gostaria de tirar uma duvida com vocês!

    Quero criar uma trigger que ao realizar o insert o campo PK da tabela seja composto de ANOmesDIASequencia por exemplo:

    201308220001

    Alguém poderia me ajudar.?

    quinta-feira, 22 de agosto de 2013 18:38

Respostas

  • Olá,

    Você pode definir a sua chave primaria como composta.

    Terá duas colunas nas chave:

    • id to dipo inteiro; Nesta coluna você pode utilizar identity para que seja sequencial. 
    • data do tipo date

    Se estiveres utilizando o sql 2012 poderás utilizar o recurso de sequence.

    No meu blog tem um exemplo de como utilizar sequence.

    Link: http://bobgalvao.wordpress.com/2011/10/06/objeto-sequence-no-sql-server-denali/

    "Se a resposta foi útil, não esqueça de marcar a resposta."

    Roberto Galvão
    MCITP - Administration SQL Server 2008
    MCITP - Developer SQL Server 2008
    MCSA - SQL Server 2012


    Roberto Galvão | MCTS | MCITP | Microsoft Partner |

    quinta-feira, 22 de agosto de 2013 18:56
  • Opa,

    Neste caso sugiro que você defina a sua coluna de ID com identity.

    Ficaria assim a sua tabela:

    CREATE TABLE [dbo].[tbExemplo](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [data] [date] NOT NULL,
    [descricao] [varchar](50) NOT NULL,
     CONSTRAINT [PK_tbExemplo] PRIMARY KEY CLUSTERED 
    (
    [id] ASC,
    [data] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]

    GO

    "Se a resposta foi útil, não esqueça de marcar a resposta."

    Roberto Galvão
    MCITP - Administration SQL Server 2008
    MCITP - Developer SQL Server 2008
    MCSA - SQL Server 2012


    Roberto Galvão | MCTS | MCITP | Microsoft Partner |

    • Sugerido como Resposta Roberto Galvão quinta-feira, 22 de agosto de 2013 19:25
    • Marcado como Resposta Alysson Queiroz sexta-feira, 23 de agosto de 2013 17:16
    quinta-feira, 22 de agosto de 2013 19:25

Todas as Respostas

  • Olá,

    Você pode definir a sua chave primaria como composta.

    Terá duas colunas nas chave:

    • id to dipo inteiro; Nesta coluna você pode utilizar identity para que seja sequencial. 
    • data do tipo date

    Se estiveres utilizando o sql 2012 poderás utilizar o recurso de sequence.

    No meu blog tem um exemplo de como utilizar sequence.

    Link: http://bobgalvao.wordpress.com/2011/10/06/objeto-sequence-no-sql-server-denali/

    "Se a resposta foi útil, não esqueça de marcar a resposta."

    Roberto Galvão
    MCITP - Administration SQL Server 2008
    MCITP - Developer SQL Server 2008
    MCSA - SQL Server 2012


    Roberto Galvão | MCTS | MCITP | Microsoft Partner |

    quinta-feira, 22 de agosto de 2013 18:56
  • Neste caso estou na Versão MS SQL Server 2008, tem como ser feito no 2008, já que nele não possui o objeto SEQUENCE.

    no aguardo.

    quinta-feira, 22 de agosto de 2013 19:18
  • Opa,

    Neste caso sugiro que você defina a sua coluna de ID com identity.

    Ficaria assim a sua tabela:

    CREATE TABLE [dbo].[tbExemplo](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [data] [date] NOT NULL,
    [descricao] [varchar](50) NOT NULL,
     CONSTRAINT [PK_tbExemplo] PRIMARY KEY CLUSTERED 
    (
    [id] ASC,
    [data] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]

    GO

    "Se a resposta foi útil, não esqueça de marcar a resposta."

    Roberto Galvão
    MCITP - Administration SQL Server 2008
    MCITP - Developer SQL Server 2008
    MCSA - SQL Server 2012


    Roberto Galvão | MCTS | MCITP | Microsoft Partner |

    • Sugerido como Resposta Roberto Galvão quinta-feira, 22 de agosto de 2013 19:25
    • Marcado como Resposta Alysson Queiroz sexta-feira, 23 de agosto de 2013 17:16
    quinta-feira, 22 de agosto de 2013 19:25
  • Roberto Galvão

    Desta forma ele não esta criando o ID com "anomesdiaesequencia" = 20130822001 mas esta bloqueando os id com erro no insert e gravando o próximo.

    O que na verdade queria era criar um campo PK que no insert ele gerar o código como o exemplo  "anomesdiaesequencia" = 20130822001.

    at,

    quinta-feira, 22 de agosto de 2013 19:42
  • David,

    Este tipo de coluna o SQL Server não dispõe. Terás que que fazer alguma coisa customizada pela sua aplicação. Até a versão 2008 R2 o SQL Server tem como auto incremento o identity.

    Você até pode fazer este contador via sql server , talvez utilizando uma trigger para tratar os dados antes de inserir na tabela, o que não seria muito performático. O problema é como você fará para controlar o incremento. 

    Sugiro tratar com chave composta da forma que mencionei acima. Assim todo controle de incremento fica a cargo do SQL Server. Se você fizer algo customizado, terás que fazer um controle pesado por transação para que duas transações nao peguem os mesmos ids.

    "Se a resposta foi útil, não esqueça de marcar a resposta."

    Roberto Galvão
    MCITP - Administration SQL Server 2008
    MCITP - Developer SQL Server 2008
    MCSA - SQL Server 2012

     


    Roberto Galvão | MCTS | MCITP | Microsoft Partner |



    quinta-feira, 22 de agosto de 2013 19:53