none
alterando tabela - chave primária RRS feed

  • Pergunta

  • Boa tarde,

    Estou precisando alterar uma coluna de uma tabela, só que via código sql e não pelo managment (visual).

    Tenho uma tabela chamada Pasta, onde há o campo chamado idPasta.

    Apenas para vcs entenderem...: Esta tabela é importada de um outro banco de dados pelo SSIS. (do 2005 express para o 2000 Enterprise). Mas a importação não trás os atributos da pasta, como identity e chave primária....


    Então, oque eu preciso é mais ou menos isso:


    "Alter Table Pasta

     Alter Column idPasta Int Identity[1,1]"


    Este código citado acima é um exemplo que eu achei aqui no fórum, mas não funciona em meu queryAnalyzer do 2000. Ao rodar este código no Analyzer, a mensagem que eu recebo é a seguinte:

    Server: Msg 156, Level 15, State 1, Line 3
    Incorrect syntax near the keyword 'Identity'.


    Aliás, o campo idPasta é numeric e não int... Eu já rodei tb com numeric no lugar de int, mas a msg é a mesma.

    Agradeço desde já.

    Diogo.

    segunda-feira, 4 de janeiro de 2010 18:52

Todas as Respostas

  • Olá Diogo,

    Não use colchetes, e sim parênteses.

    Abraços

    ANDRÉ ROCHA
    segunda-feira, 4 de janeiro de 2010 19:03
  • Boa tarde,


    Você deseja retirar a propriedade identity ou criá-la ?

    Independente do que seja, acredito que você vai ter que dropar o campo e recriá-lo
    Anderson - DBA/MCP/MCTS/MCITP/MCT - Sua pergunta foi respondida ? Marque-a como tal! www.myspace.com/andersondpa
    segunda-feira, 4 de janeiro de 2010 19:16
  • Andre,

    Eu coloquei parênteses... mas apresentou a mesma mensagem de erro.


    segunda-feira, 4 de janeiro de 2010 19:41
  • Anderson,

    Eu desejo criá-la.

    segunda-feira, 4 de janeiro de 2010 19:58
  • DiFurlan de uma olhadinha nesse link pode ser q te ajude.

    http://social.msdn.microsoft.com/Forums/pt-BR/520/thread/483ccf3c-413c-43e4-9d73-95810e9e1475


    Se a minha ajuda lhe for útil não esqueça de classificar. Att. Leonardo Marcelino
    segunda-feira, 4 de janeiro de 2010 20:35
  • DiFurlan,

    Não é possível no SQL Server alterar uma coluna utilizando a propriedade Identity, neste caso, será necessário criar uma nova coluna ou dropar a existente e criá-la novamente.
    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    segunda-feira, 4 de janeiro de 2010 23:39
  • Boa Noite,

    Se a importação é de SQL Server para SQL Server você não deve utilizar o Data Flow. Procure o objeto Copy SQL Server Objects. Ele preservará as características como chave e Identity. Você pode até utilizar o Data Flow, mas será necessário garantir que a coluna no destino possui a propriedade Identity já que é impossível colocá-la ou retirá-la após a criação da coluna.

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com

    A Impedância, o Mapeamento Objeto Relacional e Implementações – Parte III
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!899.entry


    Classifique as respostas. O seu feedback é imprescindível
    terça-feira, 5 de janeiro de 2010 00:28
  • Muito Obrigado !!!

    terça-feira, 5 de janeiro de 2010 10:53
  • Junior, obrigado.
    terça-feira, 5 de janeiro de 2010 10:54
  • Gustavo,

    A importação é de SQL Server (2005 Express) para SQL Server (2000 Enterprise) sim.

    Sinceramente eu nao sei se eu utilizo o método Data Flow (Fluxo de Dados, correto?)

    O SSIS me permite duas formas (lógico que primeiro dessa escolha eu seleciono o Data Source e o Destination...! ).

    São elas: 
    1- Copy data from one or more tables or views;
    2- Write a query to specify the data to transfer.

    Eu utilizo a opção 1. Caso contrário teria que escrever o código SQL na unha capaz de realizar a transferência... :/

    Daí seleciono 5 tabelas do banco de dados, as necessárias. Há uma opção chamada Optimize to many tables que eu seleciono... (?) e Run in a transaction, que também seleciono. 
    Volto na seleção das tabelas e com todas as 5 marcadas, clico em Edit Mapping, que me dá 3 opções selecionáveis: Drop and recreate new destination tables, delete rows in existing destination tables, Enable identity insert.

    Depois disso mando iniciar o trabalho.

    mas as tabelas nao são recriadas no destino com a chave primária...

    o que posso fazer? estou fazendo pelo caminho errado?

    Obrigado.
    terça-feira, 5 de janeiro de 2010 11:20
  • Olá Diogo,

    Tenta o seguinte:

    Na tela onde você selecionará as tabelas, clique na que está ocorrendo o problema, porém o nome da tabela que aparecer ao lado em "destination", coloque um nome de uma tabela que não existe, então clique no botão "edit mappings", após isto deixe marcado a opção de criar a tabela no destino, pois desta forma você poderá clicar no botão "edit SQL" e editar o código "CREATE TABLE", alterando-o para criar o campo identity.

    Após isto você clica em ok e na tela anterior marca a opção "enable identity insert", e daí dá para seguir, tenta e retorna algo ok?



    Abraços, André Rocha. http://br.linkedin.com/pub/andre-rocha/10/269/5a http://CleverData.com.br
    terça-feira, 5 de janeiro de 2010 12:30
  • Diogo,

    Se o objetivo é so importar os dados talvez poderíamos pensar um utilizar o comando SQLCMD ou BCP exportando estes dados para arquivos txt e depois importando no SQL Server 2000 através do DTS.
    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    terça-feira, 5 de janeiro de 2010 12:41
  • CleverData e Junior,

    Por favor, permitam-me colocar a minha ideia no contexto correto:

    Diariamente, pela manhã, eu preciso enviar os novos registros de 5 tables de um banco de dados que está no SQLSERVER 2005 express (que está instalado na máquina X) para um banco de dados que está no SQLSERVER 2000 Enterprise (este instalado na máquina Y).

    Eu consigo fazer o envio diariamente, mas o procedimento está muito gambiarra... Antes de utilizar o SISS eu tenho que apagar as 5 tabelas que estão no Banco de dados de destino (Y). Após a deleção, eu utilizo o SISS da forma que citei nos posts anteriores, logo acima.

    Porém, como também mencionei, as tabelas vão, mas não criam as Pks e a identity que eu quero...

    Os softwares que utilizo não sentem falta da PK nem da identity, pois são tabelas que são utilizadas apenas com SELECT, embora sejam fundamentais para o funcionamento dos programas. Não há insert into nem update nestas.

    Mas mesmo assim agradeceria muito se vocês me auxiliassem a encontrar uma solução mais LIMPA para este procedimento - que é diário.

    Clever, como eu dropo as tabelas antes de iniciar, então o que faço seria mais ou menos como vc sugeriu.

    estou colocando aqui o código de uma das tabelas, que é gerado automaticamente. (A PK e identity seria 1,1 em idPasta).

    --------------------

    CREATE TABLE [BANCOTESTE3].[dbo].[Pasta] (
    [idPasta] numeric(18,0) NOT NULL,
    [TipoPasta] tinyint NOT NULL,
    [Codigo] nvarchar(20) NOT NULL,
    [TituloPasta] VARCHAR(1000),
    [PastaStatus] nvarchar(15),
    [idPesCliPrinc] numeric(18,0) NOT NULL,
    [IdPesAdvogado_Old] numeric(18,0),
    [idTipoServico] numeric(18,0),
    [DataPasta] datetime,
    [PublicarWeb] bit NOT NULL,
    [IsConfidencial] bit NOT NULL,
    [ImportData] ntext,
    [IsToNotify] bit NOT NULL,
    [DESCRICAO] ntext,
    [HasPublished] bit,
    [IdPastaSiteAdv] numeric(18,0) NOT NULL,
    [IsToPublish] bit NOT NULL,
    [Outros] VARCHAR(4000),
    [NumContrato] nvarchar(30),
    [IsLoaned] bit,
    [IsLabelWasPrinted] bit,
    [DataCadastro] datetime,
    [idTipoHonorario] numeric(18,0),
    [DataDecisao] datetime,
    [ValorCausaFim] money,
    [IdEscritorio] numeric(18,0),
    [IsToSyncPalm] bit,
    [DataPrevPagRec] datetime,
    [idContrato] numeric(18,0),
    [DataHoraOp] datetime,
    [idCentroCusto] numeric(18,0),
    [DataIniPlanejada] datetime,
    [DataTermPlanejada] datetime,
    [DataIniExecucao] datetime,
    [DataTermExecucao] datetime,
    [VarInicial] int,
    [VarFinal] int,
    [VarExecucao] int,
    [StatusDtInicio] VARCHAR(50),
    [StatusDtFim] VARCHAR(50),
    [StatusExecucao] VARCHAR(50),
    [idEscritorioOrigem] numeric(18,0)
    )
    --------------------

    Como faço?

    Obrigado!!

    terça-feira, 5 de janeiro de 2010 15:27
  • Respondi sua pergunta logo acima. obrigado!
    terça-feira, 5 de janeiro de 2010 15:27
  • Oi Diogo, pois é, realmente as vezes fica difícil falarmos soluções sem saber o ambiente e a real necessidade das pessoas.

    Como a fonte é SQL Express, algumas soluções são excluídas, porém você pode automatizar o processo sim, quais os tamanhos das tabelas envolvidas? as máquinas estão no mesmo domínio e no mesmo local físico?



    Abraços, André Rocha. http://br.linkedin.com/pub/andre-rocha/10/269/5a http://CleverData.com.br
    terça-feira, 5 de janeiro de 2010 15:35
  • Oi Clever,

    São 5 tabelas. Os nomes e seus respectivos tamanhos são:

         Nome da Tabela       Tamanho (em n° de linhas)
    1- Acompanhamento     203.840
    2- FullProcesso                  7.042
    3- Pasta                            7.041                    
    4- Pessoa                          7.264 
    5- Processo                       7.041

    As máquinas fazem parte do mesmo domínio e estão no mesmo local físico.

    Estas tabelas são importadas do banco de dados do programa principal e são utilizadas por programas feitos por mim que auxiliam o administrativo e o jurídico da empresa.

    Apenas finalizando comentário: Infelizmente o SSIS do express 2005 não funciona como o DTS do 2000... Este problema surgiu pois este programa principal passou a utilizar o Express 2005 como SGBD no lugar do MSDE 2000. Antes eu conseguia utilizar o DTS sem nenhum problema. Utilizava o item Copy Objects and Tables Between SQL Server databases  , deixava o Replace Existing Data, Copy all objects, use default options , drop destination objects, include extended properties  e todas as tabelas da origem eram copiadas de modo integral, sem nenhum problema...

    Obrigado!!!
    terça-feira, 5 de janeiro de 2010 16:13
  • Diogo,

    Apenas uma dúvida, qual o motivo de recriar as tabelas? você não poderia truncar e depois habilitar identity insert no momento da cópia?

    Sobre opções, como é a utilização das máquinas em horários noturnos?

    você precisa de apenas uma cópia diária certo?

    bem, você vê algum problema em criar um job no sql 2k que faça a carga para as tabelas através de linkedserver durante a madrugada? Vejo que apenas a primeira tabela poderia demorar um pouco, as outras seriam bem rápidas.

    outra opção seria fazer um processo através de um arquivo bat, que poderia ser chamado pelo scheduler do windows, realizando bcp e bulkinsert como citado pelo Júnior.

    Caso haja algum problema podemos testar outras opções, de acordo com as suas necessidade e possibilidades.

    Aguardo retorno.
    Abraços, André Rocha. http://br.linkedin.com/pub/andre-rocha/10/269/5a http://CleverData.com.br
    terça-feira, 5 de janeiro de 2010 17:14
  • CleverData,

    Eu nao tenho motivo para recriar a tabela.

    Eu faço assim porque simplesmente não consigo realizar a cópia integral das tabelas do bd origem para o bd destino sem que essas deixem de perder as PK's e identitys..

    Eu preciso de uma cópia diária. Poderia ser à noite sim.

    Não há nenhum problema em criar um job no 2k que faça a carga para as tabelas através de linkedserver, conforme vc comentou.

    Até porque quando saio de férias, quem faz este procedimento de traslado de dados de um bd para outro é um funcionário que não tem nada haver com informática. :/   Já livraria esse procedimento, que é importante, de uma pessoa que não é habilitada para tal.

    Se não der certo eu topo tentar criar um arquivo bat e rodá-lo pelo scheduler do windows realizando bcp e bulkinsert, assim como o Junior havia citado.

    Obrigado pela atenção.

    Diogo.
    terça-feira, 5 de janeiro de 2010 18:24
  • Se eu tento enviar a tabela Pasta, por exemplo, sem dropá-la no bd destino, apresenta o seguinte erro:

    "

    - Copying to [dbo].[Pasta] (Error)

    Messages

    ERROR : errorCode=-1071636471 description=SSIS Error Code DTS_E_OLEDBERROR. An OLE DB error has occurred. Error code: 0x80004005.
    An OLE DB record is available. Source: "Microsoft OLE DB Provider for SQL Server" Hresult: 0x80004005 Description: "Erro não especificado".
    helpFile=dtsmsg.rll helpContext=0 idofInterfaceWithError={8BDFE893-E9D8-4D23-9739-DA807BCDC2AC}

    Para obter ajuda, clique em: http://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&LinkId=20476

    ERROR : errorCode=-1071607780 description=There was an error with input column "idPesAdvogado_Old" (67) on input "OLE DB Destination Input" (29). The column status returned was: "The value violated the integrity constraints for the column.".
    helpFile=dtsmsg.rll helpContext=0 idofInterfaceWithError={8BDFE893-E9D8-4D23-9739-DA807BCDC2AC}

    Para obter ajuda, clique em: http://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&LinkId=20476

    ERROR : errorCode=-1071607767 description=SSIS Error Code DTS_E_INDUCEDTRANSFORMFAILUREONERROR. The "input "OLE DB Destination Input" (29)" failed because error code 0xC020907D occurred, and the error row disposition on "input "OLE DB Destination Input" (29)" specifies failure on error. An error occurred on the specified object of the specified component. There may be error messages posted before this with more information about the failure.
    helpFile=dtsmsg.rll helpContext=0 idofInterfaceWithError={8BDFE893-E9D8-4D23-9739-DA807BCDC2AC}

    Para obter ajuda, clique em: http://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&LinkId=20476

    ERROR : errorCode=-1073450974 description=SSIS Error Code DTS_E_PROCESSINPUTFAILED. The ProcessInput method on component "OLE DB Destination" (2) failed with error code 0xC0209029. The identified component returned an error from the ProcessInput method. The error is specific to the component, but the error is fatal and will cause the Data Flow task to stop running. There may be error messages posted before this with more information about the failure.
    helpFile=dtsmsg.rll helpContext=0 idofInterfaceWithError={8BDFE893-E9D8-4D23-9739-DA807BCDC2AC}

    Para obter ajuda, clique em: http://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&LinkId=20476

    ERROR : errorCode=-1073450975 description=SSIS Error Code DTS_E_THREADFAILED. Thread "WorkThread0" has exited with error code 0xC0209029. There may be error messages posted before this with more information on why the thread has exited.
    helpFile=dtsmsg.rll helpContext=0 idofInterfaceWithError={8BDFE893-E9D8-4D23-9739-DA807BCDC2AC}

    Para obter ajuda, clique em: http://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&LinkId=20476
    "

    terça-feira, 5 de janeiro de 2010 19:13
  • Se eu bem entendi, o que vc quer é criar um ambiente de replicaçao.
    O que eu nao entendi é porque vc toda as manhas deleta as 5 tabelas e as recria. O correto nao seria somente enviar os novos registros? Se for um modelo de replicaçao, vc deveria usar o tipo uniqueidentifier como chave e nao Identity caso vc tenha insersao dos dois lados, mas creio que nao seja o seu caso.

    Espero entender melhor sua necessidade para poder ajuda-lo, mas olhe o seguinte cenario:

    Ali vc tem uma fonte que sempre envia (e nunca recebe) dados do destino. Creio que seja esse o seu caso.

    Veja mais sobre o uniqueidentifier

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    SOGI INFORMATIQUE LTÉE (http://www.sogi.com)
    terça-feira, 5 de janeiro de 2010 19:53
  • Difurlan,

    O processo de replicação necessita que seja configurada nas tabelas que serão utilizadas para receber os dados um coluna do tipo Uniqueidentifier criada no processo de configuração do própria SQL Server para controlar o envio/recebido dos dados.

    Isso consiste na configuração da replicação, controlados pelo Snapshot responsável em gerar todos os artigos envolvidos na replicação.

    Que tipo de replicação você esta utilizando?
    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    terça-feira, 5 de janeiro de 2010 23:47
  • Júnior,

    O mesmo está utilizando SSIS, conforme comentado o servidor "fonte" é sqlexpress, não há como replicar nativamente.

    Diogo,

    O problema ocorre pelo fato de que você tenta realizar carga nas tabelas sem seguir a hierarquia correta de chaves.


    Atenciosamente,


    André Rocha
    http://br.linkedin.com/pub/andre-rocha/10/269/5a http://CleverData.com.br
    quarta-feira, 6 de janeiro de 2010 10:45
  • Sim André,

    Voce tem razão. Há alguma ferramenta, que não seja o SSIS, que possa se ligar ao banco de dados origem (no sql exprees 2005) e ao banco de dados destino (sql 2000 enterprise)? Lembrando que os bancos encontram-se em máquinas distintas. Pergunto a respeito de outra ferramenta pois acredito que o SSIS não consiga realizar o procedimento por ser Express...

    Já citei que antes do upgrade do MSDE 2000 para o express 2005, eu realizava a importação com o DTS do SQL 2000 perfeitamente? Sem dores...

    E se há saída para o SSIS, qual a configuração que devo utilizar para obter o traslado dos novos registros?

    Obrigado,

    Diogo. 
    quarta-feira, 6 de janeiro de 2010 16:11