2010-09-16 30 views
13

tôi đổi tên một bảng trong cơ sở dữ liệu của tôi vớiLàm thế nào để đổi tên trở ngại của tôi

EXEC sp_rename 'tblOldAndBusted', 'tblNewAndShiny' 

và tất cả các ràng buộc khoá ngoại được cập nhật vào tên bảng mới, nhưng họ vẫn tên là dựa vào tên bảng cũ . Ví dụ: bây giờ tôi có FK_tblOldAndBusted_tblTastyData nhưng tôi muốn có FK_tblNewAndShiny_tblTastyData.

Có cách nào dễ dàng để viết mã này không?

Ngoài ra, tôi có quá hậu môn không? Tôi biết cơ sở dữ liệu hoạt động tốt với tên bảng cũ trong các ràng buộc, nhưng nó cảm thấy như broken windows.

+5

đây không phải là hậu môn, khi bạn gặp lỗi ràng buộc, bạn nên đặt tên và cột bảng thực tế như một phần của tên ràng buộc, vì vậy bạn có thể tìm ra vấn đề. nếu tên ràng buộc có tên bảng sai trong đó, điều đó sẽ chỉ khiến bạn chậm trễ trong việc tìm ra vấn đề. –

+2

Đó không phải là hậu môn, đó là hình phạt. –

Trả lời

20

Hãy thử:

exec sp_rename 'FK_tblOldAndBusted_tblTastyData', 'FK_tblNewAndShiny_tblTastyData', 'object' 

Ngoài ra, có một lỗi liên quan đến đổi tên những thứ như khi bạn đối phó với không mặc định schema.

Cannot rename a default constraint for a table in a schema which is not dbo by rsocol @Microsoft Connect

+0

FYI, Lỗi đang ở trạng thái đóng trong liên kết đã cho. – ManirajSS

+1

Đối với những người sử dụng 'sp_rename' với các đối tượng có dấu chấm trong tên (ràng buộc tạo ra EntityFramework), bạn sẽ cần phải đặt tham số' @ objname', cũng như bao gồm ''OBJECT'' là' @ objtype' tham số: 'sp_rename exec @objname = '[dbo] [FK_dbo.TableA_dbo.TableB_ColumnOne].', @newname = 'FK_dbo.TableA_dbo.TableC_ColumnOne', @objtype = 'đối tượng';' – dperish

0

Nếu có quá nhiều để đổi tên, làm thế nào về xuất khẩu để đổ, chỉnh sửa các bãi chứa trong bất kỳ trình soạn văn bản được lựa chọn để thay thế cho tên bảng, và sau đó khôi phục từ bãi rác? Tôi có nghĩa là xuất khẩu bãi chứa các ràng buộc duy nhất, không phải tất cả.

+0

ý tưởng thú vị , nhưng trong tình huống của tôi, tôi phải tạo một kịch bản có thể được sử dụng để thực hiện các thay đổi tương tự trên các bản sao khác của cơ sở dữ liệu. Ngẫu nhiên, nó ít hơn 10 bảng, do đó, không phải là một việc lớn. –

+0

Ok. Tôi đã phải sử dụng phương pháp như vậy khi một trong những MySQL DB của tôi đã được di chuyển từ Windows sang Amazon RDS. Chúng tôi có tất cả các tên bảng trong trường hợp trên, trong khi DUMP chúng tôi nhận được từ các cửa sổ có tất cả các trường hợp thấp hơn. Và trên RDS, và dưới Linux, các tên bảng MySQL phân biệt chữ hoa chữ thường. –

2

Nếu có ai quan tâm, tôi chỉ cần đổi tên tất cả các ràng buộc mặc định cho trường kiểm toán có tên "EnteredDate" thành mẫu cụ thể. Cập nhật và thay thế nếu cần. Tôi hy vọng điều này sẽ giúp và có thể là một điểm khởi đầu.

DECLARE @TableName VARCHAR(255), @ConstraintName VARCHAR(255) 
DECLARE constraint_cursor CURSOR 
    FOR 
     select b.name, c.name from 
     sys.all_columns a 
     inner join 
     sys.tables b 
     on 
     a.object_id = b.object_id 
     inner join 
     sys.default_constraints c 
     on a.default_object_id = c.object_id 
     where 
      b.name <> 'sysdiagrams' 
      and a.name = 'EnteredDate' -- column name 
      and b.type = 'U' 

OPEN constraint_cursor 
FETCH NEXT FROM constraint_cursor INTO @TableName, @ConstraintName 

WHILE @@FETCH_STATUS = 0 
    BEGIN 
     DECLARE @SqlScript VARCHAR(255) = '' 
     SET @SqlScript = 'sp_rename ' + @ConstraintName + ', ''DF_' + @TableName + '_EnteredDate'', ''object''' 
     EXEC(@SqlScript) 
     SELECT @TableName, @ConstraintName, 'DF_' + @TableName + '_EnteredDate', @SqlScript 
     FETCH NEXT FROM constraint_cursor INTO @TableName, @ConstraintName 
    END 
CLOSE constraint_cursor; 
DEALLOCATE constraint_cursor; 
0

Sau một đào sâu thêm, tôi thấy rằng nó thực sự có được trong hình thức này: kịch bản

EXEC sp_rename N'schema.MyIOldConstraint', N'MyNewConstraint', N'OBJECT' 

Source

0

Dựa user906573 của. Tạo một tập lệnh để đổi tên tất cả các giá trị mặc định trong cơ sở dữ liệu. Hữu ích để sửa các ràng buộc không được đặt tên rõ ràng tại thời gian tạo.

-- 
-- Generates a script to rename defaults to the pattern DF_tablename_columnname 
-- 

DECLARE @TableName VARCHAR(255), @ConstraintName VARCHAR(255), @ColumnName varchar(255), @SchemaName varchar(255) 
DECLARE constraint_cursor CURSOR 
    FOR 
     select b.name, c.name, a.name, sc.name 
     from sys.all_columns a 
     inner join sys.tables b on a.object_id = b.object_id 
     join sys.schemas sc on b.schema_id = sc.schema_id 
     inner join sys.default_constraints c on a.default_object_id = c.object_id 
     where 
      b.name <> 'sysdiagrams' 
      and b.type = 'U' 

OPEN constraint_cursor 
FETCH NEXT FROM constraint_cursor INTO @TableName, @ConstraintName, @ColumnName, @SchemaName 

WHILE @@FETCH_STATUS = 0 
    BEGIN 
     DECLARE @SqlScript VARCHAR(255) = '' 
     SET @SqlScript = 'sp_rename ''' + @SchemaName + '.' + @ConstraintName + ''', ''' + @SchemaName + '.DF_' + @TableName + '_' + @ColumnName + ''', ''object''' + char(13) + char(10) + 'GO' + char(13) + char(10) 
     --EXEC(@SqlScript) 
     print @sqlscript 
     FETCH NEXT FROM constraint_cursor INTO @TableName, @ConstraintName, @ColumnName, @SchemaName 
    END 
CLOSE constraint_cursor; 
DEALLOCATE constraint_cursor; 
3

Tôi không phải là người hâm mộ lớn của các con trỏ và điều này có thể được viết đơn giản hơn nhiều.

DECLARE @SQLCmd varchar(MAX) = '' 
SELECT 
    @SQLCmd += 'EXEC sp_rename ''' + dc.name + ''', ''DF' + 
       OBJECT_NAME(dc.parent_object_id) + c.name + ''', ''OBJECT'';' 
FROM 
    sys.default_constraints dc 
    JOIN sys.columns c 
     ON c.object_id = dc.parent_object_id 
     AND c.column_id = dc.parent_column_id 
WHERE 
    dc.name != 'DF' + object_name(dc.parent_object_id) + c.name 
    AND OBJECT_NAME(dc.parent_object_id) != 'dtproperties' 
EXEC(@SqlCmd) 
0

Tôi biết chủ đề này hơi lỗi nhưng tôi muốn đăng câu trả lời thay thế cho câu trả lời @ foxfire khi tôi thực hiện một số sửa đổi. Làm cho nó mất một đoạn nhỏ hơn của các tên như tôi chạy vào cơ sở dữ liệu, nơi có rất nhiều đổi tên nó làm cho cắt ngắn @sql. Tôi cũng đã thêm xử lý lỗi để thoát ra ngoài cũng như các tên lược đồ để xử lý các lược đồ khác với dbo. Tôi đã chọn không sử dụng một thử bắt đầu để nó có thể được sử dụng trong nhiều phiên bản máy chủ sql. Mệnh đề where có thể được thao tác để thực hiện ý định ban đầu của OP.

BEGIN TRAN 

DECLARE @sql varchar(MAX) = '...' 

WHILE LEN(@sql) > 0 BEGIN 
     SET @sql = ''; 

     SELECT TOP 50 @sql = @sql 
       + 'EXEC sp_rename N''' + SCHEMA_NAME(dc.[schema_id]) + '.' + dc.name 
       + ''', N''DF_' + OBJECT_NAME(dc.parent_object_id) + '_' + c.name 
       + ''', ''OBJECT'';' + CHAR(10) 
     FROM sys.default_constraints dc 
     inner join sys.columns c 
       ON c.object_id = dc.parent_object_id AND c.column_id = dc.parent_column_id 
     WHERE dc.name LIKE 'DF[_][_]%' -- rename any auto named defaults 

     PRINT @sql 
     EXEC(@sql) 

     IF @@ERROR <> 0 BEGIN 
       IF @@TRANCOUNT > 0 ROLLBACK TRAN 
       BREAK; 
     END 
END 

IF @@TRANCOUNT > 0 COMMIT TRAN 
--IF @@TRANCOUNT > 0 ROLLBACK TRAN 
Các vấn đề liên quan