Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Cách thêm Ràng buộc khóa chính vào Cột nhận dạng vào tất cả các bảng trong Cơ sở dữ liệu SQL Server - Hướng dẫn sử dụng SQL Server / TSQL Phần 63

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
  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. CTE vòng lặp vô hạn với TÙY CHỌN (maxrecursion 0)

  2. Cái nào nhanh hơn COALESCE HOẶC ISNULL?

  3. Bộ xử lý AMD EPYC 7002 Series và Máy chủ SQL

  4. Cách tạo mối quan hệ 1-1 thực sự trong SQL Server

  5. Vi phạm ràng buộc UNIQUE KEY trên INSERT WHERE COUNT (*) =0 trên SQL Server 2005