Sql 如何删除数据库中的所有默认约束?
我需要删除SQL Server 2008数据库中的所有默认约束。有人写过T-SQL脚本来实现这一点吗?注意,我只需要删除默认约束,而不是任何其他类型的约束。我发布代码,因为我讨厌让你注册阅读答案的网站。这个代码不是我的…先备份你的数据库 从Sql 如何删除数据库中的所有默认约束?,sql,sql-server,Sql,Sql Server,我需要删除SQL Server 2008数据库中的所有默认约束。有人写过T-SQL脚本来实现这一点吗?注意,我只需要删除默认约束,而不是任何其他类型的约束。我发布代码,因为我讨厌让你注册阅读答案的网站。这个代码不是我的…先备份你的数据库 从 这段代码似乎也删除了数据库中的所有约束,当OP想要保留其他约束时,我希望没有人会简单地下载一个他们不理解的脚本并在他们的数据上运行它……我并没有给他一个最终的解决方案,只是给他一条到达那里的路径(给一个人一条鱼,他吃一天——教一个人钓鱼,他吃一辈子)…更改一
这段代码似乎也删除了数据库中的所有约束,当OP想要保留其他约束时,我希望没有人会简单地下载一个他们不理解的脚本并在他们的数据上运行它……我并没有给他一个最终的解决方案,只是给他一条到达那里的路径(给一个人一条鱼,他吃一天——教一个人钓鱼,他吃一辈子)…更改一行代码,你就可以放弃你想要的任何类型的约束。。。
USE MyDB
DECLARE @sSql NVARCHAR(4000) SET @sSql = ''
DECLARE @sTypeDesc sysname SET @sTypeDesc = ''
DECLARE @sTableName sysname SET @sTableName = ''
DECLARE @sConstraintName sysname SET @sConstraintName = ''
DECLARE cur CURSOR DYNAMIC FOR
SELECT name,
type_desc,
OBJECT_NAME(parent_object_id)
FROM sys.objects
WHERE is_ms_shipped = 0
AND type_desc LIKE '%_CONSTRAINT'
ORDER BY type_desc, name
WHILE 1 = 1
BEGIN
OPEN cur
FETCH FIRST FROM cur INTO @sConstraintName, @sTypeDesc, @sTableName
IF @@FETCH_STATUS != 0
BEGIN
CLOSE cur
BREAK
END
WHILE @@FETCH_STATUS = 0
BEGIN
BEGIN TRY
SET @sSql = 'ALTER TABLE ' + QUOTENAME(@sTableName) + ' DROP CONSTRAINT ' + QUOTENAME(@sConstraintName)
RAISERROR('%s', 10, 1, @sSql) WITH NOWAIT
EXEC sp_executesql @sSql
END TRY
BEGIN CATCH
DECLARE @ENumber INT SET @ENumber = ISNULL(ERROR_NUMBER(), -1)
DECLARE @ESeverity INT SET @ESeverity = ISNULL(ERROR_SEVERITY(), -1)
DECLARE @EState INT SET @EState = ISNULL(ERROR_STATE(), 0) IF @EState = 0 SET @EState = 42
DECLARE @EProcedure NVARCHAR(126) SET @EProcedure = ISNULL(ERROR_PROCEDURE(), N'{N/A}')
DECLARE @ELine INT SET @ELine = ISNULL(ERROR_LINE(), -1)
DECLARE @EMessageRecv NVARCHAR(2048) SET @EMessageRecv = ISNULL(ERROR_MESSAGE(), N'')
DECLARE @EMessageSent NVARCHAR(440) SET @EMessageSent = N''
IF ERROR_PROCEDURE() IS NOT NULL SET @EMessageSent = N'Error %d, Level %d, State %d, Procedure %s, Line %d, Message: '
SET @EMessageSent = @EMessageSent + ERROR_MESSAGE()
RAISERROR(@EMessageSent, 10 /* @ESeverity */ , @EState, @ENumber, @ESeverity, @EState, @EProcedure, @ELine) WITH LOG
END CATCH
FETCH NEXT FROM cur INTO @sConstraintName, @sTypeDesc, @sTableName
END
CLOSE cur
END
DEALLOCATE cur
GO
DECLARE @QueryText VARCHAR(MAX)
DECLARE CursorQuery CURSOR FOR
-- get all tables and build dynamic sql
SELECT
'ALTER TABLE ' + '[' + s.[NAME] + '].[' + t.name + '] DROP CONSTRAINT ['+ c.name + ']'
FROM sys.objects c, sys.objects t, sys.schemas s
WHERE c.type IN ('C', 'F', 'PK', 'UQ', 'D')
AND c.parent_object_id=t.object_id AND t.type='U' AND t.SCHEMA_ID = s.schema_id
ORDER BY c.type
BEGIN TRY
OPEN CursorQuery
FETCH NEXT FROM CursorQuery INTO @QueryText
WHILE (@@FETCH_STATUS = 0) BEGIN
PRINT @QueryText
EXEC (@QueryText)
FETCH NEXT FROM CursorQuery INTO @QueryText
END
CLOSE CursorQuery
DEALLOCATE CursorQuery
END TRY
-- ERROR Messaging
BEGIN CATCH
SELECT
@QueryText as 'ErrorQuery'
, ErrorLine = ERROR_LINE()
,ErrorNumber = ERROR_NUMBER()
,ErrorSeverity = ERROR_SEVERITY()
,ErrorState = ERROR_STATE()
,ErrorMessage = ERROR_MESSAGE()
,ErrorStoredProcedure = ERROR_PROCEDURE()
END CATCH
SET NOCOUNT ON
DECLARE @dropstatements TABLE(Script VARCHAR(MAX))
DECLARE @script VARCHAR(MAX)
INSERT INTO @dropstatements
(Script)
SELECT
'ALTER TABLE dbo.' + OBJECT_NAME(parent_object_id) +
' DROP CONSTRAINT ' + Name
FROM
sys.default_constraints
WHILE EXISTS(SELECT 1 FROM @dropstatements)
BEGIN
SELECT TOP 1 @script = Script FROM @dropstatements ORDER BY Script
DELETE @dropstatements WHERE Script = @script
PRINT @script
EXEC (@script)
END