8

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

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

Select * From sysobjects Where type=...

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

Drop Table ...

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

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

4

4 回答 4

4

sys.objects结合使用来OBJECT_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小提琴

于 2013-09-07T01:29:26.693 回答
3

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

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

我开始通过清除架构来查看其中一些文章作为一种方法:有一篇关于这样做的旧文章,但是那里提到的表现在标记为 deprecated。我还查看了新表的文档,以帮助了解这里发生了什么。

还有另一个答案和它链接到的一个很棒的动态 sql 资源。

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

我认为更好的选择是

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

create database 'blah'

反而。顶部的额外咒语基本上是强制删除数据库,如此处所述

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

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

于 2014-03-31T13:59:42.123 回答
2

用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)
于 2019-03-02T10:18:11.173 回答
0

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

 sp_MSforeachtable "USE DATABASE_NAME DROP TABLE ?"

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

sp_MSforeachtable "USE DATABASE_NAME SELECT * FROM ?"
于 2013-09-07T04:06:10.517 回答