删除SQL Server数据库中属于不同模式的所有对象?

时间:2013-09-07 01:09:31

标签: sql sql-server database-schema

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

我以前使用过一个模式,所以我使用以下方法查询所有对象:

Select * From sysobjects Where type=...

然后放弃了我使用的所有内容

Drop Table ...

现在我已经介绍了另一个模式,每次我尝试删除它都会说一些关于我没有权限或者该对象不存在的事情。但是,如果我使用[schema.object]作为对象的前缀,它就可以工作。我不知道如何自动执行此操作,因为我不知道对象将属于哪个对象或哪两个模式。任何人都知道如何删除数据库中的所有对象,无论它属于哪个模式?

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

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

其他任何一个问题似乎都试图解决问题的所有对象部分。

我很惊讶你必须自己动手 - 我希望有一个下降模式等级级联。当然,设置开发服务器的每个人都必须这样做,并且在能够进行正常编程之前必须进行一些元编程是非常可怕的。无论如何......咆哮!

我开始通过清除模式来查看其中一些文章作为一种方法:有old article关于这样做,但现在提到的表格{{3} }。我还查看了marked as deprecated以帮助了解这里发生了什么。

它会链接到documentation for the new tablesanother answer

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

我认为更好的选择是去

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

create database 'blah'

代替。顶部的额外咒语基本上是强制将数据库删除为great dynamic sql resource

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

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

答案 2 :(得分:0)

我不知道您使用的是哪个版本的Sql Server,但假设是2008或更高版本,可能以下命令非常有用(请检查您是否可以将所有表格放在一个简单的行中):

 sp_MSforeachtable "USE DATABASE_NAME DROP TABLE ?"

此脚本将对数据库 DATABASE_NAME 中的所有表执行 DROP TABLE .... 。很简单,效果很好。此命令可用于执行其他sql指令,例如:

sp_MSforeachtable "USE DATABASE_NAME SELECT * FROM ?"

答案 3 :(得分:0)

使用sql2012或更高版本尝试此操作

这将有助于按选定的架构删除所有对象

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)