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