Tình huống:
Bạn đang làm việc với tư cách là nhà phát triển SQL Server. Bạn có yêu cầu này, trong đó bạn phải tạo Ràng buộc khóa chính trên tất cả các cột nhận dạng trên tất cả các bảng trong cơ sở dữ liệu SQL Server nếu không tồn tại.Tên Khóa chính phải là Pk_SchemaName_TableName_ColumnName.
Giải pháp:
Trước hết, chúng ta cần lấy danh sách các bảng có cột nhận dạng và Ràng buộc khóa chính không được tạo trên chúng. chúng tôi sẽ sử dụng bảng hệ thống và chế độ xem hệ thống để lấy tất cả các bảng có cột nhận dạng không có Ràng buộc khóa chính.Sau đó, chúng tôi sẽ sử dụng Con trỏ với SQL động để tạo câu lệnh Alter cho bảng để thêm Ràng buộc khóa chính và thực thi tập lệnh.
USE YourDatabaseName
GO
--Declare Variables
DECLARE @DatabaseName AS VARCHAR(128)
DECLARE @SchemaName AS VARCHAR(128)
DECLARE @TableName AS VARCHAR(128)
DECLARE @ColumnName AS VARCHAR(128)
DECLARE CUR CURSOR
FOR
--Get list of tables with Identity Column
--on which have no Primary Key
SELECT DB_Name() AS DatabaseName
,Schema_Name(Schema_id) AS TableSchema
,OBJECT_NAME(c.OBJECT_ID) AS TableName
,c.NAME AS ColumnName
FROM sys.columns c
INNER JOIN sys.tables t ON c.object_id = t.object_id
WHERE is_identity = 1
AND type_desc = 'USER_TABLE'
EXCEPT
SELECT TC.Table_Catalog AS DatabaseName
,TC.Table_Schema AS TableSchema
,TC.Table_Name AS TableName
,CCU.Column_Name AS ColumnName
FROM information_Schema.Table_Constraints TC
INNER JOIN Information_Schema.constraint_column_usage CCU ON TC.Constraint_Name = CCU.Constraint_Name
AND TC.Table_Name = CCU.Table_Name
WHERE Constraint_Type = 'PRIMARY KEY'
OPEN Cur
FETCH NEXT
FROM Cur
INTO @DatabaseName
,@SchemaName
,@TableName
,@ColumnName
WHILE @@FETCH_STATUS = 0
BEGIN
--Build dynamic sql for each database
DECLARE @SQL VARCHAR(MAX) = NULL
SET @SQL = 'Alter Table [' + @SchemaName + '].[' + @TableName + ']' + CHAR(10)
SET @SQL += 'Add Constraint [Pk_' + @SchemaName + '_' + @TableName
+ '_' + @ColumnName + '] '
SET @SQL += 'Primary Key ([' + @ColumnName + '])'
EXEC (@SQL)
PRINT @SQL
FETCH NEXT
FROM Cur
INTO @DatabaseName
,@SchemaName
,@TableName
,@ColumnName
END
CLOSE Cur
DEALLOCATE Cur Nếu bạn chỉ muốn tạo các câu lệnh thay thế để thêm Ràng buộc khóa chính, bạn có thể thêm nhận xét vào phần Exec (@SQL), Tập lệnh trên sẽ in các câu lệnh Alter và bạn có thể chạy tùy ý.
Ngoài ra, nếu bạn không 'Không muốn thêm phần tên lược đồ vào ràng buộc Khóa chính, bạn có thể xóa @SchemaName.
Tôi đã thực hiện truy vấn ở trên và nó đã tạo Ràng buộc khóa chính trên Cột nhận dạng nơi nó bị thiếu.
Các tập lệnh thay thế được tạo bởi script để thêm Ràng buộc khóa chính vào các cột nhận dạng. Tôi đã xác minh bảng và Ràng buộc khóa chính đã được tạo thành công.
Cách tạo Ràng buộc khóa chính trên cột nhận dạng trong cơ sở dữ liệu SQL Server