簡體   English   中英

刪除SQL Server數據庫中屬於不同模式的所有對象?

[英]Drop all objects in SQL Server database that belong to different schemas?

有沒有辦法刪除數據庫中的所有對象,對象屬於兩個不同的模式?

我以前使用過一個模式,所以我使用以下方法查詢所有對象:

Select * From sysobjects Where type=...

然后放棄我使用的一切

Drop Table ...

現在我已經介紹了另一個模式,每次我嘗試刪除它都會說一些關於我沒有權限或者該對象不存在的事情。 但是,如果我使用[schema.object]為對象添加前綴,則它可以正常工作。 我不知道如何自動執行此操作,因為我不知道對象將屬於哪個對象或哪兩個模式。 任何人都知道如何刪除數據庫中的所有對象,無論它屬於哪個模式?

(使用的用戶是兩個模式的所有者,數據庫中的對象是由所述用戶創建的,以及正在刪除對象的用戶 - 如果我使用IE的前綴,則可以工作Drop Table Schema1.blah

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小提琴

似乎沒有其他問題試圖解決問題的所有對象部分。

我很驚訝你必須自己動手 - 我希望有一個下降模式等級級聯。 當然,設置開發服務器的每個人都必須這樣做,並且在能夠進行正常編程之前必須進行一些元編程是非常可怕的。 無論如何......咆哮!

我開始查看其中一些文章作為清除模式的方法:有一篇關於這樣做的舊文章 ,但是現在提到的表格已被標記為已棄用 我還查看了新表文檔,以幫助理解這里發生了什么。

還有另一個答案 ,它鏈接到一個很棒的動態sql資源

看了所有這些東西一段時間后,它們似乎有點太亂了。

我認為更好的選擇是去

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

create database 'blah'

代替。 頂部的額外咒語基本上是強制刪除這里提到的數據庫

感覺有點不對,但編寫drop腳本所涉及的復雜程度是我認為避免它的一個很好的理由。

如果刪除數據庫似乎有問題,我可能會重新訪問一些鏈接並發布另一個答案

嘗試使用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)

我不知道您使用的是哪個版本的Sql Server,但假設是2008或更高版本,可能以下命令將非常有用(檢查您是否可以將所有表格放在一個簡單的行中):

 sp_MSforeachtable "USE DATABASE_NAME DROP TABLE ?"

此腳本將對數據庫DATABASE_NAME中的所有表執行DROP TABLE .... 很簡單,效果很好。 此命令可用於執行其他sql指令,例如:

sp_MSforeachtable "USE DATABASE_NAME SELECT * FROM ?"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM