Alterando o tamanho de uma coluna referenciada por uma exibição vinculada ao esquema no SQL Server

124

Estou tentando alterar o tamanho de uma coluna no servidor sql usando:

ALTER TABLE [dbo].[Address]
ALTER COLUMN [Addr1] [nvarchar](80) NULL

onde o comprimento de Addr1era originalmente 40.

Falha ao gerar este erro:

The object 'Address_e' is dependent on column 'Addr1'.
ALTER TABLE ALTER COLUMN Addr1 failed because one or more objects access 
this column.

Eu tentei ler sobre isso e parece que, porque alguns modos de exibição fazem referência a esta coluna e parece que o SQL Server está realmente tentando descartar a coluna que gerou o erro.

Address_e é uma exibição criada pelo administrador de banco de dados anterior.

Existe alguma outra maneira de alterar o tamanho da coluna?

Staelen
fonte
2
Address_e é uma exibição criada pelo administrador anterior do DB. E, como o que Remus mencionou, ele tem SCHEMABINDING definido.
249 Staelen

Respostas:

58

As visualizações são provavelmente criadas usando a opção WITH SCHEMABINDING e isso significa que elas são explicitamente conectadas para impedir essas alterações. Parece que a ligação de esquema funcionou e impediu você de quebrar essas visualizações, dia de sorte, hein? Entre em contato com o administrador do banco de dados e peça para ele fazer a alteração, depois que ela afirmar o impacto no banco de dados.

Do MSDN :

SCHEMABINDING

Vincula a visualização ao esquema da (s) tabela (s) subjacente (s). Quando SCHEMABINDING é especificado, a tabela ou tabelas base não podem ser modificadas de maneira a afetar a definição da visualização. A definição da visualização em si deve primeiro ser modificada ou eliminada para remover dependências na tabela que deve ser modificada.

Remus Rusanu
fonte
1
graças ao Remus, a visualização tem SCHEMABINDING definida. existe alguma maneira fácil de contornar a restrição ou eu realmente preciso remover as visualizações para fazê-lo funcionar?
243 Staelen
1
Você não pode ignorá-lo, esse é todo o seu propósito. Alguém se esforçou demais para adicionar o schemabindig para evitar alterações na tabela. Isso não é um acidente, parece que a pessoa sabe o que estava fazendo. Tem certeza de que deseja alterar a tabela?
Remus Rusanu
1
sim, tenho certeza =) e logicamente (mesmo sabendo que não funciona dessa maneira), estou aumentando o comprimento da coluna, o que realmente deve ficar bom apenas se a coluna não for descartada e recriada, mas infelizmente não é assim ... mas obrigado pela sua ajuda! = D
Staelen
2
Estou vendo o mesmo problema e, infelizmente, estamos usando as exibições SCHEMABINDING para indexar as exibições. Portanto, no meu caso, não estou usando SCHEMABINDING para bloquear explicitamente as alterações nas tabelas subjacentes, mas apenas para cumprir os requisitos do SQL Server para usar modos de exibição indexados. Eu também gostaria de contornar isso sem descartar e recriar meus pontos de vista.
precisa saber é o seguinte
256
ALTER TABLE [table_name] ALTER COLUMN [column_name] varchar(150)
Syed Baqar Hassan
fonte
11
nah, o problema era como o que Remus mencionou. não há nada de errado com o próprio código
Staelen
11
@ NilRad Ummm, talvez você esteja pensando em PL-SQL? ALTER COLUMN é a sintaxe correta no SQL 2008 R2
schmidlop
4
Estou esquecendo de algo? Por que tantos votos positivos? Não responde à pergunta.
Andy Wiesendanger
13
O número de votos positivos pode ser porque esta pergunta é atualmente o principal resultado do Google para 'tsql alter nvarchar length' e, portanto, pessoas (como eu) que só querem ser lembradas de como alterar o comprimento de uma coluna veem esta resposta e acima -vote para dizer "obrigado" sem identificar (como eu não lia até ler seu comentário) que a pergunta é mais sutil do que o título da pergunta sugere.
precisa saber é o seguinte
6

Se alguém quiser "Aumentar a largura da coluna da tabela replicada" no SQL Server 2008, não será necessário alterar a propriedade " replicate_ddl=1". Basta seguir as etapas abaixo -

  1. Abrir SSMS
  2. Conectar-se ao banco de dados do Publisher
  3. comando de execução -- ALTER TABLE [Table_Name] ALTER COLUMN [Column_Name] varchar(22)
  4. Isso aumentará a largura da coluna de e varchar(x)para a varchar(22)mesma alteração que você pode ver no assinante (a transação foi replicada). Portanto, não há necessidade de reinicializar a replicação

Espero que isso ajude todos os que a procuram.

Devshish
fonte
5

Veja este link

Redimensionar ou modificar uma coluna da tabela do MS SQL Server com restrição padrão usando comandos T-SQL

a solução para esse problema do SQL Server será

Descartando ou desativando a restrição DEFAULT na coluna da tabela.

Modificando o tipo de dados da coluna da tabela e / ou tamanho dos dados.

Recrie ou habilite a restrição padrão de volta na coluna da tabela sql.

Tchau

RRUZ
fonte
e as visualizações de ligação de esquema precisam ser eliminadas e recriadas.
Nurettin
2

aqui está o que funciona com a versão do programa que estou usando: pode funcionar para você também.

Apenas colocarei a instrução e o comando que o fazem. classe é o nome da tabela. você o altera na tabela com este método. não apenas o retorno do processo de pesquisa.


ver a classe da tabela

select * from class

altere o comprimento das colunas FacID (visto como "faci") e número de classe (visto como "classnu") para ajustar os rótulos inteiros.

alter table class modify facid varchar (5);

alter table class modify classnumber varchar(11);

veja a tabela novamente para ver a diferença

select * from class;

(execute o comando novamente para ver a diferença)


Isso altera a tabela real para o bem, mas para o melhor.

PS Fiz estas instruções como uma nota para os comandos. Este não é um teste, mas pode ajudar em um :)

Passingn Searcher
fonte
0

Verifique o agrupamento da coluna. Este script pode alterar o agrupamento para o padrão da tabela. Adicione o agrupamento atual ao script.

user3103989
fonte