Ändern der Größe einer Spalte, auf die in SQL Server von einer schemagedeckten Ansicht verwiesen wird


124

Ich versuche, die Größe einer Spalte in SQL Server zu ändern, indem ich:

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

wo die Länge Addr1ursprünglich war 40.

Es ist fehlgeschlagen und hat diesen Fehler ausgelöst:

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

Ich habe versucht, es zu lesen, und es scheint, dass SQL Server tatsächlich versucht, die Spalte zu löschen, die den Fehler ausgelöst hat, da einige Ansichten auf diese Spalte verweisen.

Address_e ist eine Ansicht, die vom vorherigen DB-Administrator erstellt wurde.

Gibt es eine andere Möglichkeit, die Größe der Spalte zu ändern?


2
Address_e ist eine Ansicht, die vom vorherigen DB-Administrator erstellt wurde. Und wie Remus es erwähnt hat, hat es SCHEMABINDING definiert.
Staelen

Antworten:


58

Die Ansichten werden wahrscheinlich mit der Option WITH SCHEMABINDING erstellt. Dies bedeutet, dass sie explizit verkabelt sind, um solche Änderungen zu verhindern. Sieht so aus, als ob das Schema funktioniert hat und Sie daran gehindert hat, diese Ansichten zu brechen, Glückstag, oder? Wenden Sie sich an Ihren Datenbankadministrator und bitten Sie ihn, die Änderung vorzunehmen, nachdem die Auswirkungen auf die Datenbank bestätigt wurden.

Von MSDN :

SCHEMABINDING

Bindet die Ansicht an das Schema der zugrunde liegenden Tabelle oder Tabellen. Wenn SCHEMABINDING angegeben ist, können die Basistabelle oder Tabellen nicht so geändert werden, dass sich dies auf die Ansichtsdefinition auswirkt. Die Ansichtsdefinition selbst muss zuerst geändert oder gelöscht werden , um Abhängigkeiten von der zu ändernden Tabelle zu entfernen.


1
danke Remus, für die Ansicht ist SCHEMABINDING definiert. Gibt es eine einfache Möglichkeit, die Einschränkung zu umgehen, oder muss ich die Ansichten wirklich entfernen, damit sie funktioniert?
Staelen

1
Man kann es nicht umgehen, das ist sein ganzer Zweck. Jemand hat sich die Länge genommen, um das Schema hinzuzufügen, um Tabellenänderungen zu verhindern. Dies ist kein Unfall, es sieht so aus, als ob die Person weiß, was sie getan hat. Sind Sie sicher , dass Sie die Tabelle ändern?
Remus Rusanu

1
Ja, ich bin sicher =) und logischerweise (obwohl ich weiß, dass es nicht so funktioniert) erhöhe ich die Länge der Spalte, was eigentlich nur in Ordnung sein sollte, wenn die Spalte nicht gelöscht und neu erstellt wird, aber leider ist es nicht so ... aber danke für deine hilfe! = D
Staelen

2
Ich sehe das gleiche Problem und leider verwenden wir SCHEMABINDING-Ansichten, um die Ansichten zu indizieren. In meinem Fall verwende ich SCHEMABINDING also nicht, um Änderungen an den zugrunde liegenden Tabellen explizit zu blockieren, sondern nur, um die Anforderungen von SQL Server an verwendete indizierte Ansichten zu erfüllen. Ich möchte dies auch umgehen, ohne meine Ansichten fallen zu lassen und neu zu erstellen.
Jpierson

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

11
Nein, das Problem war wie das, was Remus erwähnte. Es ist nichts falsch mit dem Code selbst
Staelen

11
@NilRad Ummm, vielleicht denkst du an PL-SQL? ALTER COLUMN ist die korrekte Syntax unter SQL 2008 R2
schmidlop

4
Vermisse ich etwas Warum so viele positive Stimmen? Es beantwortet die Frage nicht.
Andy Wiesendanger

13
Die Anzahl der Up- Votes kann daran liegen, dass diese Frage derzeit der Top- Google-Hit für "tsql alter nvarchar length" ist. Personen (wie ich), die nur daran erinnert werden möchten, wie die Länge einer Spalte geändert werden soll, sehen diese Antwort und höher - Stimmen Sie ab, um "Danke" zu sagen, ohne zu bemerken (wie ich es erst beim Lesen Ihres Kommentars getan habe), dass die Frage subtiler ist, als der Titel der Frage vermuten lässt.
Dumbledad

6

Wenn jemand in SQL Server 2008 die Spaltenbreite der replizierten Tabelle erhöhen möchte, muss die Eigenschaft von " replicate_ddl=1" nicht geändert werden . Befolgen Sie einfach die folgenden Schritte -

  1. Öffnen Sie SSMS
  2. Stellen Sie eine Verbindung zur Publisher-Datenbank her
  3. Führen Sie den Befehl aus -- ALTER TABLE [Table_Name] ALTER COLUMN [Column_Name] varchar(22)
  4. Dadurch wird die Spaltenbreite von varchar(x)auf varchar(22)und dieselbe Änderung erhöht, die Sie auf dem Abonnenten sehen können (Transaktion wurde repliziert). Sie müssen die Replikation also nicht neu initialisieren

Hoffe, dies wird allen helfen, die danach suchen.


5

Siehe diesen Link

Ändern oder Ändern der Größe einer MS SQL Server-Tabellenspalte mit Standardbeschränkung mithilfe von T-SQL-Befehlen

Die Lösung für ein solches SQL Server-Problem wird sein

Löschen oder Deaktivieren der DEFAULT-Einschränkung in der Tabellenspalte.

Ändern des Tabellenspaltendatentyps und / oder der Datengröße.

Neuerstellen oder Aktivieren der Standardeinschränkung für die SQL-Tabellenspalte.

Tschüss


und Schema-Bindungsansichten müssen gelöscht und neu erstellt werden.
Nurettin

2

Folgendes funktioniert mit der Version des von mir verwendeten Programms: Funktioniert möglicherweise auch für Sie.

Ich werde nur die Anweisung und den Befehl platzieren, die es tun. Klasse ist der Name der Tabelle. Mit dieser Methode ändern Sie es in der Tabelle selbst. nicht nur die Rückkehr zum Suchprozess.


Zeigen Sie die Tabellenklasse an

select * from class

Ändern Sie die Länge der Spalten FacID (als "faci" bezeichnet) und classnumber (als "classnu" bezeichnet), um sie an die gesamten Beschriftungen anzupassen.

alter table class modify facid varchar (5);

alter table class modify classnumber varchar(11);

Tabelle erneut anzeigen, um den Unterschied zu erkennen

select * from class;

(Führen Sie den Befehl erneut aus, um den Unterschied festzustellen.)


Dies ändert die tatsächliche Tabelle für immer, aber zum Besseren.

PS Ich habe diese Anweisungen als Notiz für die Befehle zusammengestellt. Dies ist kein Test, kann aber bei einem helfen :)


0

Überprüfen Sie die Spaltensortierung. Dieses Skript ändert möglicherweise die Sortierung in den Tabellenstandard. Fügen Sie dem Skript die aktuelle Sortierung hinzu.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.