Zmiana rozmiaru kolumny, do której odwołuje się widok powiązany ze schematem w programie SQL Server


124

Próbuję zmienić rozmiar kolumny na serwerze sql za pomocą:

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

gdzie długość Addr1była pierwotnie 40.

Nie udało się, powodując ten błąd:

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

Próbowałem go przeczytać i wydaje się, że ponieważ niektóre widoki odwołują się do tej kolumny i wygląda na to, że SQL Server faktycznie próbuje usunąć kolumnę, która spowodowała błąd.

Address_e to widok utworzony przez poprzedniego administratora bazy danych.

Czy jest inny sposób zmiany rozmiaru kolumny?


2
Adres_e to widok utworzony przez poprzedniego administratora bazy danych. I tak jak wspomniał Remus, ma zdefiniowane SCHEMABINDING.
Staelen

Odpowiedzi:


58

Widoki są prawdopodobnie tworzone przy użyciu opcji WITH SCHEMABINDING, co oznacza, że ​​są one jawnie połączone, aby zapobiec takim zmianom. Wygląda na to, że ten schemat zadziałał i uniemożliwił złamanie tych poglądów, szczęśliwy dzień, co? Skontaktuj się z administratorem bazy danych i poproś go o dokonanie zmiany, po potwierdzeniu wpływu na bazę danych.

Z MSDN :

SCHEMATING

Wiąże widok ze schematem podstawowej tabeli lub tabel. Jeśli określono SCHEMABINDING, tabela lub tabele bazowe nie mogą być modyfikowane w sposób, który miałby wpływ na definicję widoku. Samą definicję widoku należy najpierw zmodyfikować lub usunąć, aby usunąć zależności z tabeli, która ma zostać zmodyfikowana.


1
dzięki Remus, widok ma zdefiniowane SCHEMATY. czy jest jakiś łatwy sposób na obejście tego ograniczenia, czy naprawdę muszę usunąć widoki, aby działało?
Staelen

1
Nie możesz tego ominąć, to jest cały jego cel. Ktoś zrobił więcej, aby dodać schemat, aby zapobiec zmianom tabeli. To nie jest przypadek, wygląda na to, że osoba wie, co robi. Czy na pewno chcesz zmienić tabelę?
Remus Rusanu

1
tak, jestem pewien =) i logicznie (chociaż wiem, że to nie działa w ten sposób) zwiększam długość kolumny, co powinno być w porządku tylko wtedy, gdy kolumna nie zostanie upuszczona i odtworzona, ale niestety tak nie jest ... ale dzięki za pomoc! = D
Staelen

2
Widzę ten sam problem i niestety używamy widoków SCHEMABINDING do indeksowania widoków. Więc w moim przypadku nie używam SCHEMABINDING do jawnego blokowania zmian w bazowych tabelach, ale tylko w celu spełnienia wymagań SQL Server do używanych widoków indeksowanych. Chciałbym też to ominąć bez pomijania i odtwarzania moich widoków.
jpierson,

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

11
nie, problem był taki, jak wspomniał Remus. nie ma nic złego w samym kodzie
Staelen

11
@NilRad Ummm, może myślisz o PL-SQL? ALTER COLUMN to poprawna składnia w SQL 2008 R2
schmidlop

4
Czy coś mi brakuje? Skąd tyle głosów za? Nie odpowiada na pytanie.
Andy Wiesendanger

13
Liczba głosów pozytywnych może wynikać z tego, że to pytanie jest obecnie największym hitem Google dla „tsql alter nvarchar length”, a zatem ludzie (tacy jak ja), którzy chcą tylko przypomnieć, jak zmienić długość kolumny, zobacz tę odpowiedź i więcej - zagłosuj, aby powiedzieć „dziękuję” bez zauważenia (tak jak nie zrobiłem, dopóki nie przeczytałem twojego komentarza), że pytanie jest bardziej subtelne niż sugeruje tytuł pytania.
dumbledad

6

Jeśli ktoś chce „zwiększyć szerokość kolumny replikowanej tabeli” w SQL Server 2008, nie ma potrzeby zmieniania właściwości „ replicate_ddl=1”. Po prostu wykonaj poniższe czynności -

  1. Otwórz SSMS
  2. Połącz się z bazą danych wydawcy
  3. Uruchom polecenie -- ALTER TABLE [Table_Name] ALTER COLUMN [Column_Name] varchar(22)
  4. Zwiększy to szerokość kolumny od varchar(x)do varchar(22)i tę samą zmianę, którą możesz zobaczyć na subskrybencie (transakcja została zreplikowana). Nie ma więc potrzeby ponownego inicjowania replikacji

Mam nadzieję, że pomoże to wszystkim, którzy tego szukają.


5

Zobacz ten link

Zmień rozmiar lub zmodyfikuj kolumnę tabeli MS SQL Server z domyślnym ograniczeniem za pomocą poleceń T-SQL

rozwiązaniem takiego problemu SQL Server będzie

Usuwanie lub wyłączanie ograniczenia DEFAULT w kolumnie tabeli.

Modyfikowanie typu danych kolumny tabeli i / lub rozmiaru danych.

Ponowne tworzenie lub włączanie domyślnego ograniczenia z powrotem w kolumnie tabeli sql.

PA


a widoki powiązań schematu należy usunąć i ponownie utworzyć.
nurettin

2

oto, co działa z wersją programu, którego używam: może zadziałać również dla Ciebie.

Po prostu umieszczę instrukcję i polecenie, które to robi. class to nazwa tabeli. za pomocą tej metody zmieniasz to w tabeli na siebie. nie tylko zwrot z procesu wyszukiwania.


zobacz klasę tabeli

select * from class

zmień długość kolumn FacID (widziany jako „faci”) i numer klasy (jako „classnu”), aby dopasować całe etykiety.

alter table class modify facid varchar (5);

alter table class modify classnumber varchar(11);

zobacz tabelę ponownie, aby zobaczyć różnicę

select * from class;

(uruchom ponownie polecenie, aby zobaczyć różnicę)


To zmienia rzeczywistą tabelę na dobre, ale na lepsze.

PS Zrobiłem te instrukcje jako notatkę do poleceń. To nie jest test, ale może pomóc w jednym :)


0

Sprawdź ułożenie kolumn. Ten skrypt może zmienić sortowanie na domyślne ustawienie tabeli. Dodaj bieżące sortowanie do skryptu.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.