Modifica della dimensione di una colonna a cui fa riferimento una vista associata allo schema in SQL Server


124

Sto cercando di cambiare la dimensione di una colonna nel server SQL usando:

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

dove la lunghezza Addr1era originariamente 40.

Non è riuscito, generando questo errore:

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

Ho provato a leggerlo e sembra che, poiché alcune visualizzazioni fanno riferimento a questa colonna e sembra che SQL Server stia effettivamente cercando di eliminare la colonna che ha generato l'errore.

Address_e è una vista creata dal precedente amministratore DB.

C'è un altro modo in cui posso cambiare la dimensione della colonna?


2
Address_e è una vista creata dall'amministratore DB precedente. E come quello che Remus ha menzionato, ha definito SCHEMABINDING.
Staelen,

Risposte:


58

Le viste vengono probabilmente create utilizzando l'opzione WITH SCHEMABINDING e ciò significa che sono esplicitamente cablate per impedire tali modifiche. Sembra che lo schema abbia funzionato e ti abbia impedito di infrangere quei punti di vista, giorno fortunato, eh? Contattare l'amministratore del database e chiedergli di apportare la modifica, dopo aver verificato l'impatto sul database.

Da MSDN :

SCHEMABINDING

Associa la vista allo schema della tabella o delle tabelle sottostanti. Quando si specifica SCHEMABINDING, la tabella o le tabelle di base non possono essere modificate in modo tale da influire sulla definizione della vista. La definizione della vista stessa deve essere prima modificata o eliminata per rimuovere le dipendenze dalla tabella da modificare.


1
grazie Remus, la vista ha SCHEMABINDING definito. esiste un modo semplice per aggirare il vincolo o devo davvero rimuovere le viste per farlo funzionare?
Staelen,

1
Non puoi bypassarlo, è tutto per questo. Qualcuno ha fatto di più per aggiungere lo schema per impedire le modifiche alla tabella. Questo non è un incidente, sembra che la persona sappia cosa stava facendo. Sei sicuro di voler cambiare la tabella?
Remus Rusanu,

1
sì, sono sicuro =) e logicamente (anche se so che non funziona in questo modo) sto aumentando la lunghezza della colonna, il che dovrebbe davvero andare bene solo se la colonna non viene rilasciata e ricreata, ma purtroppo non è così ... ma grazie per l'aiuto! = D
Staelen,

2
Sto riscontrando lo stesso problema e sfortunatamente stiamo usando le viste SCHEMABINDING per indicizzare le viste. Quindi nel mio caso non sto usando SCHEMABINDING per bloccare esplicitamente le modifiche alle tabelle sottostanti, ma solo per soddisfare i requisiti di SQL Server per le viste indicizzate utilizzate. Vorrei anche aggirare questo senza lasciar cadere e ricreare le mie opinioni.
jpierson,

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

11
nah, il problema era come quello di cui parlava Remus. non c'è niente di sbagliato nel codice stesso
Staelen

11
@NilRad Ummm, forse stai pensando a PL-SQL? ALTER COLUMN è la sintassi corretta su SQL 2008 R2
schmidlop

4
Mi sto perdendo qualcosa? Perché così tanti voti positivi? Non risponde alla domanda.
Andy Wiesendanger,

13
Il numero di voti positivi potrebbe essere dovuto al fatto che questa domanda è attualmente la migliore hit di Google per "tsql alter nvarchar length" e quindi le persone (come me) che vogliono solo essere ricordate come modificare la lunghezza di una colonna vedono questa risposta e -vota di dire "grazie" senza individuare (come non ho fatto fino a leggere il tuo commento) che la domanda è più sottile di quanto il titolo della domanda suggerisca.
silente,

6

Se qualcuno desidera "Aumentare la larghezza della colonna della tabella replicata" in SQL Server 2008, non è necessario modificare la proprietà di " replicate_ddl=1". Segui semplicemente i passaggi seguenti:

  1. Apri SSMS
  2. Connetti al database di Publisher
  3. comando run - ALTER TABLE [Table_Name] ALTER COLUMN [Column_Name] varchar(22)
  4. Esso aumenterà la larghezza della colonna da varchar(x)a varchar(22)e lo stesso cambiamento si può vedere sul sottoscrittore (transazione ottenuto replicato). Quindi non è necessario inizializzare nuovamente la replica

Spero che questo possa aiutare tutti coloro che lo stanno cercando.


5

Vedi questo link

Ridimensionare o modificare una colonna della tabella MS SQL Server con vincolo predefinito utilizzando i comandi T-SQL

la soluzione per tale problema di SQL Server sarà

Eliminazione o disabilitazione del vincolo DEFAULT nella colonna della tabella.

Modifica del tipo di dati della colonna della tabella e / o della dimensione dei dati.

Ricreare o abilitare nuovamente il vincolo predefinito nella colonna della tabella sql.

Ciao


e le viste di associazione dello schema devono essere eliminate e ricreate.
Nurettin,

2

ecco cosa funziona con la versione del programma che sto usando: potrebbe funzionare anche per te.

Metterò semplicemente le istruzioni e il comando che lo fa. class è il nome della tabella. lo cambi nella tabella da solo con questo metodo. non solo il ritorno sul processo di ricerca.


visualizza la classe della tabella

select * from class

cambia la lunghezza delle colonne FacID (visto come "faci") e classnumber (visto come "classnu") per adattarsi a tutte le etichette.

alter table class modify facid varchar (5);

alter table class modify classnumber varchar(11);

guarda di nuovo la tabella per vedere la differenza

select * from class;

(esegui di nuovo il comando per vedere la differenza)


Questo cambia la tabella effettiva per il bene, ma per il meglio.

PS Ho scritto queste istruzioni come nota per i comandi. Questo non è un test, ma può aiutare su uno :)


0

Controlla le regole di confronto delle colonne. Questo script potrebbe modificare le regole di confronto sui valori predefiniti della tabella. Aggiungi le regole di confronto correnti allo script.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.