【问题标题】:Drop all objects in SQL Server database that belong to different schemas?删除 SQL Server 数据库中属于不同架构的所有对象?
【发布时间】:2013-09-11 04:44:36
【问题描述】:

有没有办法删除数据库中的所有对象,这些对象属于两个不同的模式?

我之前一直在使用一种模式,因此我使用以下方式查询所有对象:

Select * From sysobjects Where type=...

然后放弃了我使用的所有东西

Drop Table ...

现在我已经引入了另一个模式,每次我尝试删除它时都会说我没有权限或对象不存在。但是,如果我在对象前面加上[schema.object],它就可以工作。我不知道如何自动执行此操作,因为我不知道对象是什么对象,也不知道该对象属于两个模式中的哪一个。任何人都知道如何将所有对象放入数据库中,无论它属于哪个模式?

(使用的用户是两个模式的所有者,数据库中的对象是由所述用户创建的,以及删除对象的用户 - 如果我使用 IE 前缀,这将起作用。Drop Table Schema1.blah

【问题讨论】:

  • 提示:系统架构。事实上:sys.schemas

标签: sql sql-server database-schema


【解决方案1】:

sys.objectsOBJECT_SCHEMA_NAME 结合使用来构建您的DROP TABLE 语句,查看,然后复制/粘贴以执行:

SELECT 'DROP TABLE ' +
       QUOTENAME(OBJECT_SCHEMA_NAME(object_id)) + '.' +
       QUOTENAME(name) + ';'
  FROM sys.objects
 WHERE type_desc = 'USER_TABLE';

或使用sys.tables 来避免需要type_desc 过滤器:

SELECT 'DROP TABLE ' +
       QUOTENAME(OBJECT_SCHEMA_NAME(object_id)) + '.' +
       QUOTENAME(name) + ';'
  FROM sys.tables;

SQL Fiddle

【讨论】:

  • 另外,从 SQL Server 2005 及更高版本开始,我建议使用更集中的 sys.tables 视图,而不是从 sys.objects 中选择并且必须提供 @987654334 @ ....
  • 这正是我要找的,这和最初推荐的 sys.schemas 一样吗?我遇到的唯一问题是我想删除所有对象,并且我能够找到除函数之外的所有 sys.table、sys.vew 等。但是您的第一个建议对此效果很好。
【解决方案2】:

我不知道您使用的是哪个版本的 Sql Server,但假设是 2008 或更高版本,也许以下命令会非常有用(检查您是否可以在一行中删除所有 TABLES):

 sp_MSforeachtable "USE DATABASE_NAME DROP TABLE ?"

此脚本将对数据库 DATABASE_NAME 中的所有表执行 DROP TABLE ....。非常简单并且完美运行。该命令可用于执行其他sql指令,例如:

sp_MSforeachtable "USE DATABASE_NAME SELECT * FROM ?"

【讨论】:

  • use 更改当前 数据库,而不是当前架构(我什至不确定是否存在 current 架构的概念SQL 服务器)
  • @a_horse_with_no_name 抱歉我的错误,我的帖子已更正。谢谢。
【解决方案3】:

其他问题似乎都没有试图解决问题的所有对象部分。

我很惊讶你必须自己动手 - 我预计会有一个 drop schema blah cascade。当然,每个设置开发服务器的人都必须这样做,并且在能够进行正常编程之前必须进行一些元编程是非常可怕的。无论如何...咆哮!

我开始通过清除架构来查看其中一些文章作为一种方法:有一个关于这样做的old article,但是那里提到的表现在是marked as deprecated。我还查看了documentation for the new tables 以帮助了解这里发生了什么。

another answer 和一个great dynamic sql resource 它链接到。

看了所有这些东西一段时间后,这一切似乎有点太乱了。

我认为更好的选择是去

ALTER DATABASE 'blah' SET SINGLE_USER WITH ROLLBACK IMMEDIATE
drop database 'blah'

create database 'blah'

相反。顶部的额外咒语基本上是强制删除数据库为mentioned here

感觉有点不对劲,但我认为编写 drop 脚本所涉及的复杂性是避免它的一个很好的理由。

如果删除数据库似乎有问题,我可能会重新访问一些链接并发布另一个答案

【讨论】:

  • 完全同意您关于缺少删除模式级联的观点。这个答案说服了我停止搜索,而只是擦除整个数据库。
  • @flodin 是的,起初我觉得有点不对劲,但从那以后我就再也没有回头。在 sql server 中拆除 + 创建新数据库并不是一项昂贵的操作。很高兴能帮上忙!
【解决方案4】:

用sql2012或更高版本试试这个,

此脚本可能有助于删除所选架构的所有对象 注意:以下脚本用于所有对象的 dbo 架构,但您可以在第一行进行更改 @MySchemaName

DECLARE @MySchemaName VARCHAR(50)='dbo', @sql VARCHAR(MAX)='';
DECLARE @SchemaName VARCHAR(255), @ObjectName VARCHAR(255), @ObjectType VARCHAR(255), @ObjectDesc VARCHAR(255), @Category INT;

DECLARE cur CURSOR FOR
    SELECT  (s.name)SchemaName, (o.name)ObjectName, (o.type)ObjectType,(o.type_desc)ObjectDesc,(so.category)Category
    FROM    sys.objects o
    INNER JOIN sys.schemas s ON o.schema_id = s.schema_id
    INNER JOIN sysobjects so ON so.name=o.name
    WHERE s.name = @MySchemaName
    AND so.category=0
    AND o.type IN ('P','PC','U','V','FN','IF','TF','FS','FT','PK','TT')

OPEN cur
FETCH NEXT FROM cur INTO @SchemaName,@ObjectName,@ObjectType,@ObjectDesc,@Category

SET @sql='';
WHILE @@FETCH_STATUS = 0 BEGIN    
    IF @ObjectType IN('FN', 'IF', 'TF', 'FS', 'FT') SET @sql=@sql+'Drop Function '+@MySchemaName+'.'+@ObjectName+CHAR(13)
    IF @ObjectType IN('V') SET @sql=@sql+'Drop View '+@MySchemaName+'.'+@ObjectName+CHAR(13)
    IF @ObjectType IN('P') SET @sql=@sql+'Drop Procedure '+@MySchemaName+'.'+@ObjectName+CHAR(13)
    IF @ObjectType IN('U') SET @sql=@sql+'Drop Table '+@MySchemaName+'.'+@ObjectName+CHAR(13)

    --PRINT @ObjectName + ' | ' + @ObjectType
    FETCH NEXT FROM cur INTO @SchemaName,@ObjectName,@ObjectType,@ObjectDesc,@Category
END
CLOSE cur;    
DEALLOCATE cur;
SET @sql=@sql+CASE WHEN LEN(@sql)>0 THEN 'Drop Schema '+@MySchemaName+CHAR(13) ELSE '' END
PRINT @sql
EXECUTE (@sql)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-09
    • 2011-04-10
    • 1970-01-01
    • 2013-09-21
    • 1970-01-01
    • 1970-01-01
    • 2018-01-15
    相关资源
    最近更新 更多