Salvando alterações após a edição da tabela no SQL Server Management Studio

265

Se eu quiser salvar as alterações em uma tabela, salvas anteriormente no SQL Server Management Studio (nenhum dado na tabela presente), recebo uma mensagem de erro:

Salvar alterações não é permitido. As alterações feitas exigem que as tabelas a seguir sejam eliminadas e recriadas. Você fez alterações em uma tabela que não pode ser recriada ou ativou a opção Impedir salvar alterações que exigem a recriação da tabela.

O que pode impedir que a tabela seja editada facilmente? Ou é a maneira usual do SQL Server Management Studio exigir a recriação da tabela para edição? O que é isso - esta "opção Evitar salvar alterações" ?

rem
fonte
1
@ Pang - Esta pergunta veio primeiro, esta é a duplicata.
GrandMasterFlush
@Ang - eu não sabia disso, obrigado.
GrandMasterFlush

Respostas:

573

Vá em Ferramentas -> Opções -> Designers-> Desmarque a opção "Impedir salvar alterações que exigem a recriação da tabela". Voila.

Isso acontece porque, às vezes, é necessário descartar e recriar uma tabela para alterar alguma coisa. Isso pode demorar um pouco, pois todos os dados devem ser copiados para uma tabela temporária e depois reinseridos na nova tabela. Como o SQL Server por padrão não confia em você, você precisa dizer "OK, eu sei o que estou fazendo, agora deixe-me fazer o meu trabalho".

Pedro
fonte
8
O site de suporte da Microsoft desencoraja isso, mas se você não tiver nenhum dado na tabela, não vejo mal. Provavelmente é melhor usar o TSQL para fazer as alterações.
21810 Jon Smock
6
Eu pessoalmente desencorajaria o uso do designer em bancos de dados importantes. Eu já vi cometer erros caros em muitas ocasiões. Além disso, promove hábitos de desenvolvimento preguiçosos e permite que as pessoas modifiquem a estrutura do banco de dados que pode não ser proficiente o suficiente para fazê-lo se não puderem gerenciar a rota de código SQL.
Mark W Dickson
5
Concordo, Mark, mas no início do desenvolvimento não preciso escrever uma pilha de scripts.
21420 Kristopher
7
É chocante que seja setembro de 2016 e esse erro inacreditável e hostil ao usuário (sem opção de perguntar "Ei, você gostaria de permitir alterações na tabela?") Ainda está em jogo. Não, você acabou de obter um botão Cancelar e precisa fazer suas alterações novamente. SQL Server é mais estúpido.
Mike Gledhill
2
@ Mike Gledhill Saudações a partir de 2019 e este ainda é o caso LOL
Captain Kenpachi
116

Ferramentas> Opções

insira a descrição da imagem aqui

Desmarque a opção acima

Prasanna
fonte
5
Obrigado pela captura de tela. Eu estava procurando por algo assim para me ajudar a encontrar essa opção estúpida. A caixa de diálogo deve ter uma caixa de seleção para "faça assim mesmo" quando diz que você não pode.
precisa
2
O Best Practice Depois de alterar esta opção é verificar a opção superior 'Auto gerar scripts de alteração', a fim de evitar que os dados perder
Dubi
Obrigado pela imagem. É muito útil :)
M A.
72

Para contornar esse problema, use instruções SQL para fazer as alterações na estrutura de metadados de uma tabela.

Esse problema ocorre quando "Impedir salvar alterações que exigem recriação de tabela" está ativada.

Origem: mensagem de erro ao tentar salvar uma tabela no SQL Server 2008: "Salvar alterações não é permitido"

Daniel Vassallo
fonte
12
Minha pergunta aqui é: por que o SQL Server não usa as instruções T-SQL necessárias em vez de descartar e recriar a tabela para cada alteração única? Não consigo entender esse comportamento.
Jaime
15

Em vez de desmarcar a caixa (uma solução ruim), você deve PARAR de editar os dados dessa maneira. Se os dados precisarem ser alterados, faça-o com um script, para que você possa portá-lo facilmente para produção e para que esteja sob controle de origem. Isso também facilita a atualização das alterações de teste depois que a produção é reduzida para dev para permitir que os desenvolvedores trabalhem com dados mais atualizados.

HLGEM
fonte
2
A) Você pode copiar o script que o SSMS gera e usá-lo no seu ambiente de produção. B) O SSMS geralmente é mais fácil, rápido e seguro porque o SSMS lida com todos os detalhes para você.
Trisped
2
Itg ainda é uma péssima idéia. Você não deseja recriar uma tabela de 10.000.000 de registros no prod. Não é mais rápido. Como é mais seguro? Dados inválidos são dados incorretos e as verificações de consistência funcionam se você usar um script que escreveu e se permitir que o SSMS escreva um. É uma prática POBRE em 100% dos casos.
HLGEM #
14

Muitas alterações que você pode fazer de maneira fácil e visual no editor de tabelas no SQL Server Management Studio exigem que o SSMS solte a tabela em segundo plano e recriá-la do zero. Mesmo coisas simples como reordenar as colunas não podem ser expressas na instrução SQL DDL padrão - tudo o que o SSMS pode fazer é soltar e recriar a tabela.

Essa operação pode: a) consumir muito tempo em uma tabela grande ou b) pode até falhar por vários motivos (como restrições de FK e outras coisas). Portanto, o SSMS no SQL Server 2008 introduziu essa nova opção que as outras respostas já identificaram.

Pode parecer contra-intuitivo a princípio impedir essas mudanças - e certamente é um incômodo para um servidor de desenvolvimento. Porém, em um servidor de produção, essa opção e seu valor padrão para impedir essas alterações se tornam um potencial salva-vidas!

marc_s
fonte
2
Agora estou em um servidor de desenvolvimento, mas em um servidor de produção, com certeza o ligarei novamente. Obrigado mais uma vez por compartilhar experiências
rem
1
Mas, por exemplo, alterar o tamanho de uma coluna nvarchar de 100 para 120 é uma operação muito simples que pode ser feita facilmente com ALTER TABLE ... então, por que o SQL Server (Management Studio) está descartando e recriando a tabela para tal casos?
Jaime
4
@ Jaime: que você precisa perguntar aos desenvolvedores desse designer visual - ninguém mais sabe. É apenas um fato - com o designer visual, muitas mudanças diretas sempre serão feitas recriando a tabela e copiando. Se você deseja usar a abordagem direta, cabe a você lidar com isso escrevendo algumas instruções T-SQL fáceis e executando-as.
marc_s
1
Obrigado @marc_s Esta é exatamente a resposta que eu estava esperando, mas eu tinha pouca fé neles ter um motivo oculto que explicaria tudo :)
Jaime
1
Essa restrição também impede que o ID do objeto seja alterado sem que você saiba (caso você precise que isso não aconteça).
Trisped