การเปลี่ยนขนาดของคอลัมน์ที่อ้างอิงโดยมุมมองที่ผูกกับสคีมาใน SQL Server


124

ฉันกำลังพยายามเปลี่ยนขนาดของคอลัมน์ในเซิร์ฟเวอร์ sql โดยใช้:

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

ที่ความยาวของเดิมAddr140

ล้มเหลวโดยเพิ่มข้อผิดพลาดนี้:

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 เป็นมุมมองที่สร้างขึ้นโดย DB Administrator คนก่อน

มีวิธีอื่นอีกไหมที่ฉันสามารถเปลี่ยนขนาดของคอลัมน์ได้


2
Address_e เป็นมุมมองที่สร้างโดยผู้ดูแลระบบ DB คนก่อน และเช่นเดียวกับสิ่งที่ Remus กล่าวถึงมีการกำหนดตารางเวลาไว้
Staelen

คำตอบ:


58

มุมมองอาจถูกสร้างขึ้นโดยใช้ตัวเลือกการกำหนดตารางเวลาและนั่นหมายความว่ามุมมองเหล่านี้มีการเชื่อมต่ออย่างชัดเจนเพื่อป้องกันการเปลี่ยนแปลงดังกล่าว ดูเหมือนว่าแผนภาพจะใช้งานได้และป้องกันไม่ให้คุณทำลายมุมมองเหล่านั้นวันที่โชคดีห๊ะ? ติดต่อผู้ดูแลระบบฐานข้อมูลของคุณและขอให้เขาทำการเปลี่ยนแปลงหลังจากยืนยันผลกระทบต่อฐานข้อมูล

จากMSDN :

SCHEMABINDING

เชื่อมโยงมุมมองกับสคีมาของตารางที่อ้างอิงหรือตาราง เมื่อระบุ SCHEMABINDING ตารางพื้นฐานหรือตารางไม่สามารถแก้ไขได้ในลักษณะที่จะส่งผลต่อนิยามมุมมอง คำจำกัดความของมุมมองต้องได้รับการแก้ไขก่อนหรือลดลงเพื่อลบการอ้างอิงบนตารางที่จะแก้ไข


1
ขอบคุณรีมัสมุมมองมีกำหนดการกำหนดไว้ มีวิธีง่ายๆในการหลีกเลี่ยงข้อ จำกัด หรือไม่หรือฉันจำเป็นต้องลบมุมมองเพื่อให้ใช้งานได้จริง
Staelen

1
คุณไม่สามารถข้ามได้นั่นคือจุดประสงค์ทั้งหมด มีคนเพิ่มความยาวเป็นพิเศษเพื่อเพิ่ม schemabindig เพื่อป้องกันการเปลี่ยนแปลงตาราง นี่ไม่ใช่อุบัติเหตุดูเหมือนว่าเจ้าตัวจะรู้ว่ากำลังทำอะไรอยู่ คุณแน่ใจหรือไม่ว่าคุณต้องการเปลี่ยนตารางหรือไม่
Remus Rusanu

1
ใช่ฉันแน่ใจ =) และมีเหตุผล (แม้ว่าฉันจะรู้ว่ามันไม่ได้ผลเช่นนั้น) ฉันกำลังเพิ่มความยาวของคอลัมน์ซึ่งควรจะดีก็ต่อเมื่อคอลัมน์ไม่ได้ถูกทิ้งและสร้างขึ้นใหม่ แต่ น่าเสียดายที่มันไม่เป็นเช่นนั้น ... แต่ขอบคุณสำหรับความช่วยเหลือของคุณ! = D
Staelen

2
ฉันพบปัญหาเดียวกันและน่าเสียดายที่เราใช้การดูแบบกำหนดเวลาเพื่อจัดทำดัชนีการดู ดังนั้นในกรณีของฉันฉันไม่ได้ใช้ 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

4
ฉันพลาดอะไรไปรึเปล่า? ทำไมถึงโหวตมาก มันไม่ตอบคำถาม
Andy Wiesendanger

13
จำนวนโหวตที่เพิ่มขึ้นอาจเป็นเพราะคำถามนี้เป็นคำถามยอดนิยมของ Google สำหรับ 'tsql alter nvarchar length'ดังนั้นผู้คน (เช่นฉัน) ที่ต้องการได้รับการเตือนว่าจะเปลี่ยนความยาวของคอลัมน์ได้อย่างไรดูคำตอบนี้ขึ้นไป - ลงคะแนนเพื่อกล่าว "ขอบคุณ" โดยไม่ต้องจำ (เนื่องจากฉันไม่ได้อ่านความคิดเห็นของคุณ) ว่าคำถามนั้นละเอียดอ่อนกว่าที่ชื่อคำถามแนะนำ
dumbledad

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 ด้วย Default Constraint โดยใช้คำสั่ง T-SQL

ทางออกสำหรับปัญหา SQL Server ดังกล่าวจะเป็น

การทิ้งหรือปิดใช้งาน DEFAULT Constraint ในคอลัมน์ตาราง

การแก้ไขชนิดข้อมูลคอลัมน์ตารางและ / หรือขนาดข้อมูล

สร้างใหม่หรือเปิดใช้งานข้อ จำกัด เริ่มต้นในคอลัมน์ตาราง 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;

(รันคำสั่งอีกครั้งเพื่อดูความแตกต่าง)


สิ่งนี้จะเปลี่ยนตารางจริงให้ดีขึ้น แต่ให้ดีขึ้น

ปล. ฉันทำคำแนะนำเหล่านี้ขึ้นเพื่อเป็นหมายเหตุสำหรับคำสั่ง นี่ไม่ใช่การทดสอบ แต่สามารถช่วยได้ :)


0

ตรวจสอบการเรียงคอลัมน์ สคริปต์นี้อาจเปลี่ยนการเปรียบเทียบเป็นค่าเริ่มต้นของตาราง เพิ่มการจัดเรียงปัจจุบันลงในสคริปต์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.