2008-10-10 29 views
5

Tôi muốn tìm lệnh sql hoặc thứ gì đó có thể thực hiện việc này khi tôi có bảng có tên tblFoo và tôi muốn đặt tên là tblFooBar. Tuy nhiên, tôi muốn khóa chính để cũng được thay đổi, ví dụ, hiện nay nó là:Đổi tên Bảng SQL Server, xếp tầng thay đổi thông qua PK và FK's

CONSTRAINT [PK_tblFoo] PRIMARY KEY CLUSTERED 

Và tôi muốn một sự thay đổi tên để thay đổi nó để:

CONSTRAINT [PK_tblFooBar] PRIMARY KEY CLUSTERED 

Sau đó, đệ quy đi qua và cascade thay đổi này trên tất cả các bảng có một mối quan hệ chính foreigh, ví dụ như. từ này:

CHECK ADD CONSTRAINT [FK_tblContent_tblFoo] FOREIGN KEY([fooID]) 

Để này:

CHECK ADD CONSTRAINT [FK_tblContent_tblFooBar] FOREIGN KEY([fooID]) 

Đương nhiên, tôi đang cố gắng không để đi qua và làm được điều này tất cả bằng tay bởi vì a) nó là một quá trình dễ bị lỗi, và b) nó doesn' t quy mô.

Trả lời

7

Đây chỉ là phần trên đầu của tôi và chưa hoàn thành (bạn cần phải thêm mã tương tự cho chỉ mục). Ngoài ra, bạn cần phải thêm mã để tránh đổi tên đối tượng từ một bảng có cùng tên cơ sở, nhưng các ký tự bổ sung - ví dụ, mã này cũng sẽ liệt kê tblFoo2 và tất cả các đối tượng liên quan của nó. Hy vọng rằng đó là một khởi đầu cho bạn mặc dù.

DECLARE 
    @old_name VARCHAR(100), 
    @new_name VARCHAR(100) 

SET @old_name = 'tblFoo' 
SET @new_name = 'tblFooBar' 

SELECT 
    'EXEC sp_rename ''' + name + ''', ''' + REPLACE(name, @old_name, @new_name) + '''' 
FROM dbo.sysobjects 
WHERE name LIKE '%' + @old_name + '%' 
1

Máy chủ SQL sẽ không thực hiện việc này trực tiếp theo như tôi biết. Bạn sẽ phải tự xây dựng kịch bản để thực hiện thay đổi. Điều này có thể đạt được bằng cách tạo ra SQL cho định nghĩa bảng (SSMS sẽ làm điều này) và thực hiện tìm kiếm và thay thế trên các tên.

3

Một công cụ tuyệt vời mà mất cơn đau ra khỏi bảng đổi tên là Red Gate SQL Refactor Nó sẽ tự động tìm của sự phụ thuộc và bạn làm việc tất cả những thứ ra cho bạn quá.

Big fan :-)

5

Tốt câu trả lời bởi Tom
Tôi vừa mới mở rộng truy vấn của mình ở đây bao gồm các chỉ số

declare 
@old nvarchar(100), 
@new nvarchar(100) 

set @old = 'OldName' 
set @new = 'NewName' 

select 'EXEC sp_rename ''' + name + ''', ''' + 
    REPLACE(name, @old, @new) + '''' 
from sys.objects 
where name like '%' + @old + '%' 
union -- index renames 
select 'EXEC sp_rename ''' + (sys.objects.name + '.' + sys.indexes.name) + ''', ''' + 
    REPLACE(sys.indexes.name, @old, @new) + ''', ''INDEX''' 
    from sys.objects 
    left join sys.indexes on sys.objects.object_id = sys.indexes.object_id 
    where sys.indexes.name like '%' + @old + '%' 
Các vấn đề liên quan