1

我有一个名为 Employee 的表,它引用了数据库中的近 85 个表。我想对表结构进行一些更改,为此我必须删除并重新创建表,但由于它引用了这么多表,所以我不能删除它。我能否以某种方式让约束的脚本删除并重新创建它们,因为我也需要这些约束。我不能永远放弃它们。

我能够找到子表和约束的名称,但我想要可以删除和重新创建约束的脚本。

SELECT name AS 'Foreign Key Constraint Name', 
           OBJECT_SCHEMA_NAME(parent_object_id) + '.' + OBJECT_NAME(parent_object_id) AS 'Child Table'
   FROM sys.foreign_keys 
   WHERE OBJECT_SCHEMA_NAME(referenced_object_id) = 'HRM' AND 
              OBJECT_NAME(referenced_object_id) = 'tbl_EmployeeInfo'

最好的

4

1 回答 1

2
-- =========================================================================
--                              Read the comments !!!
-- =========================================================================
DECLARE
    @source_table VARCHAR(50),
    @source_constarint VARCHAR(50),
    @source_column VARCHAR(50),
    @target_table VARCHAR(50),
    @target_column VARCHAR(50),
    @drop NVARCHAR(4000)

-- Remember the keys
SELECT 
    ccu.TABLE_NAME AS source_table
    ,ccu.CONSTRAINT_NAME AS source_constraint
    ,ccu.COLUMN_NAME AS source_column
    ,kcu.TABLE_NAME AS target_table
    ,kcu.COLUMN_NAME AS target_column
INTO #keys
FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE ccu
    INNER JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc
        ON ccu.CONSTRAINT_NAME = rc.CONSTRAINT_NAME 
    INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu 
        ON kcu.CONSTRAINT_NAME = rc.UNIQUE_CONSTRAINT_NAME 
WHERE ccu.TABLE_NAME ='TABLE NAME'

-- Delete keys
DECLARE drop_keys CURSOR FOR 
SELECT 
    source_table,
    source_constraint,
    source_column,
    target_table,
    target_column
FROM #keys
OPEN drop_keys
FETCH NEXT FROM drop_keys INTO @source_table, @source_constarint, @source_column, @target_table, @target_column
WHILE @@fetch_status <> -1
BEGIN
         SET @drop = 
         'ALTER TABLE ' + @source_table + ' DROP CONSTRAINT ' + @source_constarint 

         EXEC sp_executesql @drop

        SELECT @drop

        FETCH NEXT FROM drop_keys INTO @source_table, @source_constarint, @source_column, @target_table, @target_column
    END
    CLOSE drop_keys
    DEALLOCATE drop_keys


    -- =========================================================================
    --                      Your changes
    -- =========================================================================

    -- =========================================================================
    --                      Write a similar cursor to create keys
    --                      Make sure your cursor is creating keys
    -- =========================================================================

-- DROP table #keys -- Maybe just do not delete it until you not to recreate the keys
                    -- Maybe, Instead of inserting into a temporary table, insert it into a regular table
于 2018-05-02T09:02:09.553 回答