Изменение размера столбца, на который ссылается представление с привязкой к схеме в SQL Server


124

Я пытаюсь изменить размер столбца на сервере sql, используя:

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

где длина Addr1 была изначально 40.

Не удалось, возникла эта ошибка:

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

Я попытался прочитать его, и мне кажется, что поскольку некоторые представления ссылаются на этот столбец, кажется, что SQL Server на самом деле пытается удалить столбец, вызвавший ошибку.

Address_e это представление, созданное предыдущим администратором БД.

Есть ли другой способ изменить размер столбца?


2
Address_e - это представление, созданное предыдущим администратором БД. И, как и то, что упомянул Ремус, для него определено SCHEMABINDING.
Staelen

Ответы:


58

Представления, вероятно, создаются с использованием параметра WITH SCHEMABINDING, а это означает, что они явно подключены для предотвращения таких изменений. Похоже, что схема сработала и помешала вам нарушить эти представления, удачный день, а? Обратитесь к администратору базы данных и попросите его внести изменения после того, как они подтвердят влияние на базу данных.

Из MSDN :

SCHEMABINDING

Привязывает представление к схеме базовой таблицы или таблиц. Когда указан SCHEMABINDING, базовая таблица или таблицы не могут быть изменены таким образом, чтобы это повлияло на определение представления. Само определение представления необходимо сначала изменить или отбросить, чтобы удалить зависимости от изменяемой таблицы.


1
спасибо, Ремус, для представления определена SCHEMABINDING. есть ли простой способ обойти ограничение или мне действительно нужно удалить представления, чтобы заставить его работать?
Staelen

1
Вы не можете его обойти, в этом вся его цель. Кто-то пошел на все, чтобы добавить schemabindig для предотвращения изменений таблицы. Это не какая-то случайность, похоже, человек знает, что делал. Вы уверены, что хотите сменить стол?
Ремус Русану,

1
да, я уверен =) и логически (хотя я знаю, что это не так) я увеличиваю длину столбца, что действительно должно быть хорошо, только если столбец не удален и не воссоздан, но к сожалению, это не так ... но спасибо за помощь! = D
Staelen

2
Я вижу ту же проблему, и, к сожалению, мы используем представления SCHEMABINDING для индексации представлений. Поэтому в моем случае я не использую SCHEMABINDING для явной блокировки изменений в базовых таблицах, а только для соответствия требованиям SQL Server к используемым индексированным представлениям. Я также хотел бы обойти это, не отбрасывая и не воссоздавая свои взгляды.
jpierson

256
ALTER TABLE [table_name] ALTER COLUMN [column_name] varchar(150)

11
нет, проблема была в том, что упомянул Ремус. в самом коде нет ничего плохого
Staelen

11
@NilRad Эммм, может быть, вы думаете о PL-SQL? ALTER COLUMN - правильный синтаксис в SQL 2008 R2
schmidlop 08

4
Я что-то упускаю? Почему так много голосов? Это не отвечает на вопрос.
Энди Визендангер

13
Количество голосов «за» может быть связано с тем, что этот вопрос в настоящее время является самым популярным в Google по запросу «tsql alter nvarchar length», и, таким образом, люди (такие как я), которые просто хотят напоминать, как изменить длину столбца, видят этот ответ и выше -проголосуйте за то, чтобы сказать «спасибо», не заметив (как я не заметил, пока не прочитал ваш комментарий), что вопрос более тонкий, чем предполагает его название.
Дамблдад

6

Если кто-то хочет «Увеличить ширину столбца реплицируемой таблицы» в SQL Server 2008, то нет необходимости изменять свойство « replicate_ddl=1». Просто выполните следующие шаги -

  1. Открыть SSMS
  2. Подключиться к базе данных издателя
  3. Команда выполнения -- ALTER TABLE [Table_Name] ALTER COLUMN [Column_Name] varchar(22)
  4. Это увеличит ширину столбца с varchar(x)до varchar(22)и такое же изменение, которое вы можете увидеть на подписчике (транзакция была реплицирована). Таким образом, нет необходимости повторно инициализировать репликацию

Надеюсь, это поможет всем, кто его ищет.


5

См. Эту ссылку

Изменение размера или изменение столбца таблицы MS SQL Server с ограничением по умолчанию с помощью команд T-SQL

решение такой проблемы с SQL Server будет

Отмена или отключение ограничения DEFAULT для столбца таблицы.

Изменение типа данных столбца таблицы и / или размера данных.

Повторное создание или включение ограничения по умолчанию для столбца таблицы sql.

до свидания


и представления привязки схемы должны быть отброшены и созданы заново.
nurettin

2

вот что работает с версией программы, которую я использую: может сработать и для вас.

Я просто размещу инструкцию и команду, которая это делает. class - это имя таблицы. с помощью этого метода вы меняете его в таблице самостоятельно. не только отдача от поискового процесса.


просмотреть класс таблицы

select * from class

измените длину столбцов FacID (отображается как «faci») и classnumber (отображается как «classnu»), чтобы они соответствовали всем меткам.

alter table class modify facid varchar (5);

alter table class modify classnumber varchar(11);

просмотрите таблицу еще раз, чтобы увидеть разницу

select * from class;

(запустите команду еще раз, чтобы увидеть разницу)


Это меняет фактическую таблицу к лучшему, но к лучшему.

PS Я сделал эти инструкции как примечания к командам. Это не тест, но на одном может помочь :)


0

Проверьте сопоставление столбцов. Этот сценарий может изменить параметры сортировки по умолчанию для таблицы. Добавьте в скрипт текущее сопоставление.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.