Tình huống:
Bạn đang làm việc với tư cách là Nhà phát triển hoặc DBA của SQL Server, Bạn cần xóa một bảng khỏi cơ sở dữ liệu. Khi bạn thực hiện câu lệnh drop table SchemaName.TableName, bạn gặp lỗi dưới đây.Msg 3726, Level 16, State 1, Line 12
Không thể thả đối tượng 'SchemaName.TableName' vì nó là được tham chiếu bởi ràng buộc NGOẠI KHÓA.
Bây giờ chúng ta biết rằng bảng được tham chiếu bởi Ràng buộc khóa ngoại. Vấn đề là làm thế nào để tìm bảng nào có Ràng buộc khóa ngoại đang tham chiếu đến bảng này.
Giải pháp:
1) Có nhiều cách để lấy thông tin này. Chúng tôi có thể sử dụng các dạng xem hệ thống để tìm tên của bảng có Ràng buộc khóa ngoại đang tham chiếu đến Bảng chính của chúng tôi.SELECT Schema_Name(Schema_id) as TableSchemaName, object_name(FK.parent_object_id) ParentTableName, object_name(FK.referenced_object_id) ReferenceTableName FROM sys.foreign_keys AS FK WHERE object_name(FK.referenced_object_id)='YourTableName' and Schema_Name(Schema_id)='YourTableSchemaName'
Tôi đã thực thi tập lệnh trên cho bảng khách hàng của mình, bảng này có trong lược đồ dbo và đây là những gì tôi nhận được.
Cách tìm Khóa ngoại của bảng nào đang tham chiếu đến Bảng trong SQL Server. |
Bây giờ chúng ta biết rằng Ord là bảng có Ràng buộc khóa ngoại đang tham chiếu đến bảng của chúng ta. Chúng ta có thể tiếp tục và bỏ Ràng buộc khóa ngoại và sau đó thả bảng của chúng ta.
2) Sử dụng Quy trình lưu trữ hệ thống sp_fkeys
Chúng ta có thể sử dụng Quy trình đã lưu trữ của hệ thống để lấy thông tin Ràng buộc Khoá ngoại đang tham chiếu đến bảng của chúng ta. Nếu tên bảng của tôi là Khách hàng, tôi có thể chạy tập lệnh như bên dưới
EXEC sp_fkeys 'Customer'
Cách lấy tên Ràng buộc khóa ngoại cho một bảng trong SQL Server |
Các sp_fkeys trả về thông tin rất chi tiết, một số cột không được hiển thị trong ảnh chụp nhanh ở trên. đây là danh sách các cột mà nó sẽ trả về.
- PKTABLE_QUALIFIER
- PKTABLE_OWNER
- PKTABLE_NAME
- PKCOLUMN_NAME
- FKTABLE_QUALIFIER
- FKTABLE_OWNER
- FKTABLE_NAME
- FKCOLUMN_NAME
- KEY_SEQ
- UPDATE_RULE
- DELETE_RULE
- FK_NAME
- PK_NAME
Video Demo:Không thể thả đối tượng vì nó được tham chiếu bởi Ràng buộc khóa ngoại