去除某SQL Server数据库中所有约束,索引,触发器,统计的代码

其实主要是把网上的内容整合了一下。网上的关于索引与触发器的只有针对个别表的,我扩展到了数据库。
ContractedBlock.gif ExpandedBlockStart.gif DROP Constraints
--- Make sure we are on the correct db

USE [TestDB1] 
GO
--- Do not show record counts 

SET NOCOUNT ON

--- Declare variables to be use in script

DECLARE    @ObjectID    INT
,        
@ObjectName NVARCHAR(500)
,        
@SQL        NVARCHAR(2000)
,        
@Count        INT
,        
@ObjectType    nVARCHAR(1000)

--- Create temp table that is going to be used throughout the script

CREATE TABLE #ConstraintTemp (ObjectID INT IDENTITY(1,1NOT NULL, ObjectName NVARCHAR(250), ObjectType NVARCHAR(100))
SET @Count = 0 

--- First let's drop all the constraints on the tables
--
---- CAUTION:  Running this part removes all constraints from the database -------

INSERT INTO #ConstraintTemp (ObjectName, ObjectType)
SELECT Table_Schema + '.' + Table_Name, Constraint_Name
FROM INFORMATION_SCHEMA.Table_CONSTRAINTS
ORDER BY constraint_type , Table_Name

SELECT @ObjectID = MIN(ObjectID) FROM #ConstraintTemp

WHILE @ObjectID IS NOT NULL
BEGIN

SELECT    @ObjectName = ObjectName
,    
@ObjectType = ObjectType
FROM #ConstraintTemp WHERE ObjectID = @ObjectID

SET @SQL = 'ALTER TABLE ' + @ObjectName + ' DROP CONSTRAINT [' + @ObjectType + ']'

EXECUTE SP_EXECUTESQL @SQL


SELECT @ObjectID = MIN(ObjectID) FROM #ConstraintTemp WHERE ObjectID > @ObjectID
SET @ObjectName = NULL
SET @SQL = NULL
SET @COUNT = @Count + 1

--DROP table #ConstraintTemp
END
PRINT CAST(@Count AS NVARCHAR(10)) + ' Constraint(s) deleted'

ContractedBlock.gif ExpandedBlockStart.gif Code
use TestDB1
GO

DECLARE @SqlCmd NVARCHAR(4000)
declare @Trig sysname
declare @owner sysname
declare @uid int

DECLARE TGCursor CURSOR FOR
SELECT name, uid FROM sysobjects WHERE type = 'TR'
OPEN TGCursor
FETCH next FROM TGCursor INTO @Trig@uid
WHILE @@FETCH_STATUS = 0
BEGIN

set @SQLCmd = 'drop trigger [' + user_name(@uid+ '].[' + @Trig + ']'
exec sp_executesql @SQLCmd


print @SQLCmd


FETCH next FROM TGCursor INTO @Trig@uid
END
CLOSE TGCursor
DEALLOCATE TGCursor

GO


ContractedBlock.gif ExpandedBlockStart.gif Code
use TestDB2

declare @tablename nvarchar(500)
declare @tid int
set @tid=1

select identity(int,1,1as tid,name into #temp1 from sys.objects where type='U'

while(@tid<(select MAX(tid) from #temp1)+1)
begin
select @tablename=name from #temp1 where tid=@tid

declare @name nvarchar(50)
    ,
@errorsave int

if (rtrim(object_id(@tablename)) = ''
    
RAISERROR ('A non-zero length table name parameter is expected'161)    

BEGIN TRAN

if exists (select name from sysindexes
where id = object_id(@tablenameand indid > 0 and indid < 255 and (status & 64)=0)
begin 
    
declare ind_cursor cursor for 
    
select name from sysindexes
    
where id = object_id(@tablenameand indid > 0 and indid < 255 and (status & 64)=0

    
open ind_cursor
    
fetch next from ind_cursor into @name
    
while (@@fetch_status = 0)
    
begin 
        
print 'delete index '+@name
        
exec ('drop index ' + @tablename + '.' + @name)
        
set @errorsave = @@error
        
        
fetch next from ind_cursor into @name
    
end
    
close ind_cursor
    
deallocate ind_cursor
end 

if (@errorsave = 0)
    
COMMIT TRAN
else 
    
ROLLBACK TRAN

set @tid=@tid+1
end
drop table #temp1


ContractedBlock.gif ExpandedBlockStart.gif DROP Statistics
use TestDB1

DECLARE @ObjectName sysname
DECLARE @StatsName sysname
DECLARE StatsCursor CURSOR FAST_FORWARD
FOR
SELECT OBJECT_NAME(object_idas 'ObjectName'[name] as 'StatsName' FROM sys.stats
WHERE (INDEXPROPERTY(object_id[name]'IsAutoStatistics'= 1 OR INDEXPROPERTY(object_id[name]'IsStatistics'= 1)
AND OBJECTPROPERTY(object_id'IsMSShipped'= 0
OPEN StatsCursor
FETCH NEXT FROM StatsCursor
INTO @ObjectName@StatsName
WHILE @@FETCH_STATUS = 0
BEGIN
print @ObjectName + '.' + @StatsName
--EXEC ('DROP STATISTICS ' + @ObjectName + '.' + @StatsName)
FETCH NEXT FROM StatsCursor
INTO @ObjectName@StatsName
END
CLOSE StatsCursor
DEALLOCATE StatsCursor

转载于:https://www.cnblogs.com/galaxyyao/archive/2009/08/19/1549986.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值