Trong SQL Server, bạn có thể sử dụng sp_rename
thủ tục được lưu trữ để đổi tên một đối tượng, bao gồm một bảng.
Hầu hết các RDBM chính khác cho phép bạn đổi tên bảng bằng ALTER TABLE
nhưng đây không phải là trường hợp của SQL Server.
Ví dụ
Dưới đây là một ví dụ để chứng minh:
EXEC sp_rename 't1', 't2';
Điều này đổi tên bảng được gọi là t1
thành t2
.
Bao gồm Tên lược đồ
Bạn cũng có thể đủ điều kiện cho bảng đầu tiên có tên giản đồ, trong trường hợp đó, nó có thể trông giống như sau:
EXEC sp_rename 'dbo.t1', 't2';
Trong ví dụ này, dbo
là tên giản đồ, nhưng bạn sẽ cần sử dụng bất kỳ lược đồ nào có thể áp dụng được.
Bao gồm Tên tham số
Như với bất kỳ thủ tục được lưu trữ nào, bạn cũng có thể bao gồm tên tham số khi gọi sp_rename
:
EXEC sp_rename
@objname = 'dbo.t1',
@newname = 't2';
sp_rename
thủ tục cũng chấp nhận một @objtype
nhưng điều này không bắt buộc (hoặc được hỗ trợ) khi đổi tên bảng.
Kiểm tra tài liệu tham khảo
Khi bạn đổi tên một bảng trong SQL Server, bạn có thể sẽ thấy một thông báo như sau:
Caution: Changing any part of an object name could break scripts and stored procedures.
Điều này là do khi bạn đổi tên bảng, SQL Server không tự động đổi tên bất kỳ tham chiếu nào đến bảng đó. Điều này cũng đúng khi bạn đổi tên một cột.
Bất chấp thông báo cảnh báo ở trên, bảng vẫn được đổi tên.
Do đó, trước khi đổi tên bất kỳ bảng nào, bạn phải luôn kiểm tra các tập lệnh và thủ tục được lưu trữ tham chiếu đến bảng đó. Bạn sẽ cần cập nhật các tập lệnh và thủ tục như vậy để tham chiếu đến tên bảng mới.
Bạn có thể sử dụng sys.sql_expression_dependencies
chế độ xem danh mục hệ thống để thực hiện việc kiểm tra này.
Ví dụ:
SELECT OBJECT_NAME(referencing_id) AS [Referencing Entity],
o.type_desc AS [Type],
COALESCE(COL_NAME(referencing_id, referencing_minor_id), '(n/a)') AS [Column],
referenced_entity_name AS [Referenced Entity],
COALESCE(COL_NAME(referenced_id, referenced_minor_id), '(n/a)') AS [Column]
FROM sys.sql_expression_dependencies AS sed
INNER JOIN sys.objects AS o ON sed.referencing_id = o.object_id
WHERE referenced_id = OBJECT_ID(N't1');
Trong trường hợp này, tôi đã kết hợp nó với sys.objects
để trả lại thêm thông tin.
Đây là kết quả tôi nhận được trước khi thay đổi tên của t1
bảng:
+----------------------+----------------------+----------+---------------------+----------+ | Referencing Entity | Type | Column | Referenced Entity | Column | |----------------------+----------------------+----------+---------------------+----------| | usp_t1 | SQL_STORED_PROCEDURE | (n/a) | t1 | (n/a) | | vt1 | VIEW | (n/a) | t1 | (n/a) | | t1 | USER_TABLE | c2 | t1 | c1 | +----------------------+----------------------+----------+---------------------+----------+
Điều này cho tôi thấy rằng có một chế độ xem, một quy trình được lưu trữ và một cột được tính toán phụ thuộc vào t1
bàn. Cột được tính (c2
) tham chiếu đến c1
trong cùng một bảng.
Như đã đề cập, điều quan trọng là phải chạy kiểm tra này trước khi bạn thay đổi tên của bảng. Đây là kết quả tôi nhận được khi chạy cùng một tập lệnh sau khi thay đổi tên của bảng.
SELECT OBJECT_NAME(referencing_id) AS [Referencing Entity],
o.type_desc AS [Type],
COALESCE(COL_NAME(referencing_id, referencing_minor_id), '(n/a)') AS [Column],
referenced_entity_name AS [Referenced Entity],
COALESCE(COL_NAME(referenced_id, referenced_minor_id), '(n/a)') AS [Column]
FROM sys.sql_expression_dependencies AS sed
INNER JOIN sys.objects AS o ON sed.referencing_id = o.object_id
WHERE referenced_id = OBJECT_ID(N't1');
Kết quả:
(0 rows affected)
Trong trường hợp này, tôi đã sử dụng tên gốc của bảng (t1
), vì vậy, rõ ràng là chúng tôi thậm chí đã không nhắm mục tiêu đúng bảng (t2
).
Chỉ cần thay đổi tập lệnh này để tham chiếu đến tên bảng mới cũng sẽ không hoạt động. Ví dụ:chạy tập lệnh sau sau khi chúng tôi đã thay đổi tên của bảng từ t1
thành t2
chỉ trả về một phần phụ thuộc (cột được tính toán).
SELECT OBJECT_NAME(referencing_id) AS [Referencing Entity],
o.type_desc AS [Type],
COALESCE(COL_NAME(referencing_id, referencing_minor_id), '(n/a)') AS [Column],
referenced_entity_name AS [Referenced Entity],
COALESCE(COL_NAME(referenced_id, referenced_minor_id), '(n/a)') AS [Column]
FROM sys.sql_expression_dependencies AS sed
INNER JOIN sys.objects AS o ON sed.referencing_id = o.object_id
WHERE referenced_id = OBJECT_ID(N't2');
Kết quả:
+----------------------+------------+----------+---------------------+----------+ | Referencing Entity | Type | Column | Referenced Entity | Column | |----------------------+------------+----------+---------------------+----------| | t2 | USER_TABLE | c2 | t2 | c1 | +----------------------+------------+----------+---------------------+----------+
Tin tốt là cột đã tính được trả về. Tin xấu là chế độ xem và thủ tục đã lưu trữ không được trả lại.
Điểm mấu chốt:Kiểm tra các phần phụ thuộc trước khi bạn đổi tên bảng. Sau đó, cập nhật thủ công bất kỳ đối tượng nào tham chiếu đến bảng đã đổi tên.