Удалить все объекты в базе данных SQL Server, принадлежащие разным схемам?

Есть ли способ удалить все объекты в базе данных с объектами, принадлежащими двум разным схемам?

Раньше я работал с одной схемой, поэтому я запрашиваю все объекты, используя:

Select * From sysobjects Where type=...

затем сбросил все, что я использовал

Drop Table ...

Теперь, когда я представил другую схему, каждый раз, когда я пытаюсь ее отбросить, она говорит о том, что у меня нет разрешения или объект не существует. НО, если я поставлю перед объектом префикс [schema.object], он будет работать. Я не знаю, как это автоматизировать, потому что я не знаю, каким объектам или какой из двух схем будет принадлежать объект. Кто-нибудь знает, как удалить все объекты внутри БД, независимо от того, к какой схеме он принадлежит?

(Используемый пользователь является владельцем обеих схем, объекты в БД были созданы указанным пользователем, а также пользователем, который удаляет объекты - что работает, если я использовал префикс IE. Drop Table Schema1.blah)


person Captain Alizee    schedule 07.09.2013    source источник
comment
подсказка: sysschemas. Фактически: sys.schemas   -  person Mitch Wheat    schedule 07.09.2013


Ответы (4)


Используйте sys.objects в сочетании с _ 2_ для построения ваших 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

person Bryan    schedule 07.09.2013
comment
Кроме того, начиная с SQL Server 2005 и новее, я бы рекомендовал использовать более сфокусированное sys.tables представление вместо выбора из sys.objects и необходимости предоставлять type_desc .... - person marc_s; 07.09.2013
comment
Это именно то, что я искал, это то же самое, что изначально рекомендовалось sys.schemas? Единственная проблема, с которой я столкнулся, заключалась в том, что я хотел удалить все объекты и смог найти все sys.table, sys.vew и т. Д., Кроме функций. Но ваше первое предложение отлично сработало. - person Captain Alizee; 10.09.2013

Ни один из других вопросов, похоже, не пытался ответить на часть вопроса все объекты.

Я удивлен, что вы должны использовать это самостоятельно - я ожидал, что будет каскад бла-схемы drop schema. Конечно, каждый человек, который настраивает сервер разработки, должен будет это сделать, и необходимость выполнить какое-то метапрограммирование, прежде чем сможет заниматься обычным программированием, серьезно ужасно. В любом случае ... разглагольствовать!

Я начал рассматривать некоторые из этих статей как способ сделать это, очистив схему: там старая статья об этом, однако упомянутые там таблицы теперь помечено как устаревшее. Я также просмотрел документацию по новым таблицам, чтобы помочь понять, что здесь происходит.

Есть другой ответ и отличный динамический ресурс sql, на который он ссылается.

После того, как я посмотрел на все это некоторое время, все показалось мне слишком запутанным.

Я думаю, что лучший вариант - пойти на

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

create database 'blah'

вместо. Дополнительное заклинание вверху в основном заключается в том, чтобы принудительно удалить базу данных как упоминается здесь

Это кажется немного неправильным, но я думаю, что сложность написания сценария перетаскивания - хорошая причина его избегать.

Если возникнут проблемы с удалением базы данных, я могу еще раз просмотреть некоторые ссылки и опубликовать другой ответ.

person JonnyRaa    schedule 31.03.2014
comment
Однозначно согласен с вами в отсутствии каскада схемы отбрасывания. Этот ответ убедил меня прекратить поиск и вместо этого просто стереть всю базу данных. - person flodin; 09.09.2014
comment
@flodin да, сначала было немного не так, но с тех пор я не оглядывался. Разборка + создание новых баз данных на sql server - не дорогая операция. Рад, что помог! - person JonnyRaa; 09.09.2014

попробуйте это с 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)
person Haseeb    schedule 02.03.2019

Я не знаю, какую версию Sql Server вы используете, но при условии, что это 2008 год или новее, возможно, следующая команда будет очень полезной (убедитесь, что вы можете отбросить ВСЕ ТАБЛИЦЫ одной простой строкой):

 sp_MSforeachtable "USE DATABASE_NAME DROP TABLE ?"

Этот сценарий выполнит DROP TABLE .... для всех таблиц из базы данных DATABASE_NAME. Очень просто и отлично работает. Эту команду можно использовать для выполнения других инструкций sql, например:

sp_MSforeachtable "USE DATABASE_NAME SELECT * FROM ?"
person Gaston Flores    schedule 07.09.2013
comment
use изменяет текущую базу данных, а не текущую схему (я даже не уверен, что в SQL Server существует концепция текущей схемы) - person a_horse_with_no_name; 07.09.2013
comment
@a_horse_with_no_name извините за ошибку, мой пост был исправлен. Спасибо. - person Gaston Flores; 07.09.2013