【问题标题】:How to drop user defined objects from master database如何从主数据库中删除用户定义的对象
【发布时间】:2014-02-10 11:03:51
【问题描述】:

我正在使用SQL Server 2008 R2

我为我的项目数据库创建了一个SQL Script,即用于创建所有表、约束、视图、存储过程和函数,以及一些用于创建新数据库的最少数据。

但是我错误地在master 数据库上运行了它。所以所有这些东西都是在master 数据库中创建的。

现在,我想 drop 来自 master 数据库的所有 user-defined objects

有什么简单的方法吗?

【问题讨论】:

  • 修改您用于创建的相同脚本,改为删除并在主数据库中再次运行。
  • 你认为这是你做过的最好的解决方案吗? :)

标签: sql-server sql-server-2008 sql-server-2008-r2


【解决方案1】:

我刚刚创建了这个脚本来创建一个脚本来删除主数据库中的所有用户定义对象,只需在开发服务器上测试它,然后在生产服务器上执行它..

SELECT
    'DROP ' + CASE WHEN  type = 'U' THEN 'TABLE '
                   WHEN  type = 'P' THEN 'PROCEDURE '
                   WHEN  type = 'FN'THEN 'FUNCTION '
                   WHEN  type = 'V'THEN 'VIEW ' END
     + QUOTENAME(s.[name]) + '.' + QUOTENAME(o.[name]) + CHAR(10) + 'GO' + CHAR(10)

FROM        master.sys.objects o 
INNER JOIN  master.sys.schemas s ON o.[schema_id] = s.[schema_id]
WHERE o.[is_ms_shipped] <> 1
  AND o.[type] IN ('U','P','FN','V')

-- Results to Text --

生成脚本

DROP TABLE [dbo].[Test_table1]
GO

DROP PROCEDURE [hr].[usp_Test_Proc1]
GO

DROP VIEW [views].[vw_TestView_1]
GO

DROP PROCEDURE [dbo].[usp_Test_Proc2]
GO

DROP FUNCTION [dbo].[udf_Test_Function_GetList]
GO

注意

如果生成的脚本试图删除通过外键被其他表引用的表,则会抛出错误。

【讨论】:

  • 是的,确实如此。但是有没有其他方法可以让我们只运行一次脚本并删除它?
  • 嗯,您在 First Go 中通过从 SSMS 获取“到文本”中的结果来生成脚本,然后执行脚本 droppoping/Deleting 所有对象,涉及一个复制粘贴,仅此而已。它也可以一口气完成,但我远离电脑。无论如何,通过电话回复它并不麻烦朋友:)
  • 好的。感谢您的回复。 :) 会做更多尝试来解决它。如果我获得成功,将发布该答案,否则会将您的答案标记为真实。至此,我为您的国王解决方案提供 +1。 :) 非常感谢..
  • 我还必须使用此代码来获取用户定义的表类型SELECT 'DROP TYPE ' + QUOTENAME(SCHEMA_NAME(SCHEMA_ID)) + '.' + QUOTENAME(name) FROM sys.types WHERE is_user_defined = 1
  • 简单。有效的。我认为这一定是公认的答案。
【解决方案2】:

有关删除约束和表格的脚本,请参阅此链接。 http://www.toadworld.com/platforms/sql-server/w/wiki/10407.delete-user-objects-from-a-database.aspx 但是,它不适用于架构中定义的表,需要我进行一些更改。请在下面找到修改后的代码:

-- DROP Foreign Keys
SET NOCOUNT ON
DECLARE @fk_id int, @fk_name nvarchar(500), @parent_id int, @parent_name nvarchar(500), @schema_name nvarchar(500)
declare @sql nvarchar(2000)

DECLARE fk_cursor CURSOR FOR
SELECT [name] as fkname, schema_name([SCHEMA_ID]) as schemaname,object_name(parent_object_id) as parentname
from sys.objects where [type] = 'F'

OPEN fk_cursor

FETCH NEXT FROM fk_cursor
INTO @fk_name, @schema_name, @parent_name

WHILE @@FETCH_STATUS = 0
BEGIN
        SET @sql = N''
        SET @sql = N'ALTER TABLE [' + @schema_name + N'].[' + @parent_name + N'] DROP ' + @fk_name
        PRINT @sql
        FETCH NEXT FROM fk_cursor INTO @fk_name, @schema_name, @parent_name
END

CLOSE fk_cursor
DEALLOCATE fk_cursor


-- DROP user tables
SET NOCOUNT ON
DECLARE @tbl_name nvarchar(500)


DECLARE tbl_cursor CURSOR FOR
SELECT schema_name([SCHEMA_ID]) as schemaname, [name]
from sys.objects where [type] = 'U' order by [name]


OPEN tbl_cursor

FETCH NEXT FROM tbl_cursor
INTO @schema_name, @tbl_name

WHILE @@FETCH_STATUS = 0
BEGIN
        SET @sql = N'DROP TABLE [' + @schema_name + '].[' + @tbl_name + N'] '
        PRINT @sql    
        FETCH NEXT FROM tbl_cursor INTO @schema_name, @tbl_name

END

CLOSE tbl_cursor
DEALLOCATE tbl_cursor

注意:在执行之前请仔细阅读脚本! 请参考我的博文:http://zen-and-art-of-programming.blogspot.in/2015/04/cleanup-restore-master-database-in-sql.html

【讨论】:

    【解决方案3】:

    带有架构名称;

    SELECT
    'DROP ' +
    CASE WHEN  type = 'U'  THEN 'TABLE'
         WHEN  type = 'P'  THEN 'PROCEDURE'
         WHEN  type = 'FN' THEN 'FUNCTION'
         WHEN  type = 'V'  THEN 'VIEW' 
    END +
    ' ' + Quotename(Schema_name(schema_id)) + '.' + Quotename(Name)+ CHAR(10) + 'GO' + CHAR(10)
    FROM sys.objects
    WHERE is_ms_shipped <> 1
    AND TYPE IN ('U','P','FN','V')
    

    【讨论】:

      猜你喜欢
      • 2021-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多