删除所有主键

Dav*_*ein 2 t-sql constraints sql-server-2000 information-schema

这听起来像是一个疯狂的请求.我报告的数据库没有任何外键,每个主键都是identity_column.这使得使用诸如TOAD之类的工具变得困难,因为Intellisense通过读取PK和FK关系来工作.

任何人都有一个脚本从数据库中的每个表中删除主键,所以我可以用"正确的"PK替换它们并添加FK以协助报告?

要忘掉"不要做!!!"的意思 回复,让我明确表示我不会对我的生产数据库执行此操作,而是将其复制到另一台服务器上.

任何意见,将不胜感激.

-------编辑使用正确的信息更新.----------------

谢谢你们,但我意识到我犯了一个错误.几乎每个表都有一个具有身份属性的"identity_column".该身份是聚集索引.但是,它未被指定为主键.

首先,主键和聚簇索引之间有什么区别?

其次,如何编写所有聚簇索引的脚本?这会有用吗?

SELECT 
  'ALTER TABLE ' + OBJECT_NAME(OBJECT_ID) + ' DROP CONSTRAINT ' + name 
FROM sys.indexes WHERE type_desc = 'CLUSTERED'
Run Code Online (Sandbox Code Playgroud)

谢谢你的耐心

mar*_*c_s 6

另一种选择是两步过程:

  1. 首先,从系统目录视图中选择必要的信息,并使用这些信息构建实际删除索引和约束所需的 T-SQL 语句:

    SELECT
      'ALTER TABLE ' + OBJECT_NAME(OBJECT_ID) + ' DROP CONSTRAINT ' + name
    FROM sys.indexes WHERE is_primary_key = 1
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用该结果集,将其复制并粘贴到一个新的查询窗口中,然后运行它 - 它会从您运行它的数据库中的所有表中删除所有主键约束

这样你就避开了光标,你会得到一个要执行的语句列表,如果你不需要它,你仍然可以“按原样”使用、调整甚至完全扔掉它。


Jim*_* G. 5

如何像这样

-- Helper Procedure 
CREATE PROC #DropConstraints 
  @tableSchema nvarchar(max), 
  @tableName nvarchar(max), 
  @constraintType nvarchar(20) 
AS 
BEGIN 
  DECLARE @cName nvarchar(max); 

  DECLARE constraint_cursor CURSOR FOR 
    SELECT CONSTRAINT_NAME  
    FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
    WHERE  
      CONSTRAINT_TYPE = @constraintType 
      AND TABLE_NAME = @tableName 
      AND TABLE_SCHEMA = @tableSchema 

  OPEN constraint_cursor 

  FETCH NEXT FROM constraint_cursor INTO @cName 
  WHILE @@FETCH_STATUS = 0 
  BEGIN 
    EXEC ('ALTER TABLE ' + @tableSchema + '.' + @tableName + ' DROP CONSTRAINT ' + @cName); 
    FETCH NEXT FROM constraint_cursor INTO @cName 
  END 

  CLOSE constraint_cursor 
  DEALLOCATE constraint_cursor 
END 
GO

BEGIN TRANSACTION

  -- Setup Cursor for looping 
  DECLARE table_cursor SCROLL CURSOR FOR 
    SELECT TABLE_SCHEMA, TABLE_NAME  
    FROM INFORMATION_SCHEMA.TABLES 

  OPEN table_cursor

  -- Declare Variables

  DECLARE 
    @tableSchema nvarchar(max), 
    @tableName nvarchar(max) 

 -- Drop Primary Keys 

  FETCH FIRST FROM table_cursor INTO @tableSchema, @tableName 
  WHILE @@FETCH_STATUS = 0 
  BEGIN 
    EXEC #DropConstraints @tableSchema, @tableName, 'PRIMARY KEY'; 

    FETCH NEXT FROM table_cursor INTO @tableSchema, @tableName 
  END 

  -- Cleanup 
  CLOSE table_cursor 
  DEALLOCATE table_cursor

COMMIT TRANSACTION 
GO

DROP PROCEDURE #DropConstraints;
GO
Run Code Online (Sandbox Code Playgroud)