【问题标题】:sql 2005 force table rename that has dependenciessql 2005 强制重命名具有依赖关系的表
【发布时间】:2018-05-04 02:00:42
【问题描述】:

你如何强制重命名???

重命名表“dbo.x”失败。 (Microsoft.SqlServer.Smo)

如需帮助,请点击:http://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&ProdVer=10.0.2531.0+((Katmai_PCU_Main).090329-1045+)&EvtSrc=Microsoft.SqlServer.Management.Smo.ExceptionTemplates.FailedOperationExceptionText&EvtID=Rename+Table&LinkId=20476


执行 Transact-SQL 语句或批处理时发生异常。 (Microsoft.SqlServer.ConnectionInfo)


无法重命名对象“[dbo].[x]”,因为该对象参与了强制依赖项。 (Microsoft SQL Server,错误:15336)

如需帮助,请点击:http://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&ProdVer=09.00.4035&EvtSrc=MSSQLServer&EvtID=15336&LinkId=20476

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    找到“强制依赖项”,然后删除或禁用它们。

    “强制依赖”是指 Schema 绑定,因此您必须专门寻找它。

    这是一个用于查找对您的对象的架构绑定引用的查询:

    select o.name as ObjName, r.name as ReferencedObj
    from sys.sql_dependencies d
    join sys.objects o on o.object_id=d.object_id
    join sys.objects r on r.object_id=d.referenced_major_id
    where d.class=1
    AND r.name = @YourObjectName
    

    正如我在 cmets 中所指出的,没有 方式可以强制覆盖模式绑定。当您使用模式绑定时,您明确表示“不要不要让我或其他任何人覆盖它”。绕过 Schema Binding 的唯一方法是撤消它,这是故意的。

    【讨论】:

      【解决方案2】:

      我有同样的问题,我的问题是我有一个使用我试图重命名的列的计算字段。

      通过从选定的答案运行查询,我能够判断出已强制执行依赖项,但我无法确切地看到问题出在哪里

      【讨论】:

        【解决方案3】:

        试试这个:

        /*  
            Example 1: Rename a table dbo.MyTable -> dbo.YourTable
            EXEC dbo.USP_DROP_ENFORCED_DEPENDENCIES @SchemaName=N'dbo', @EntityName=N'MyTable', @Debug=1;
            EXEC sp_rename N'dbo.MyTable', N'YourTable', N'OBJECT'
        
            Example 2: Rename a column dbo.MyTable.MyColumn -> dbo.MyTable.YourColumn
            EXEC dbo.USP_DROP_ENFORCED_DEPENDENCIES @SchemaName=N'dbo', @EntityName=N'MyTable', @ColumnName=N'MyColumn' @Debug=1;
            EXEC sp_rename N'dbo.MyTable.MyColumn', N'YourColumn', N'COLUMN'
        
        */
        CREATE Procedure dbo.USP_DROP_ENFORCED_DEPENDENCIES
        (
            @SchemaName sysname = 'dbo',
            @EntityName sysname,
            @ColumnName sysname = NULL,
            @Debug      bit = 0
        )
        AS
        BEGIN
            SET NOCOUNT ON;
            SET ROWCOUNT 0;
        
            DECLARE @ReferencingEntitySchema sysname, @ReferencingEntityName sysname, @ReferencingEntityType nvarchar(8), @SqlScript nvarchar(512);
        
            DECLARE ReferencingEntitiesCursor CURSOR LOCAL FORWARD_ONLY 
            FOR 
                SELECT OBJECT_SCHEMA_NAME(dep.referencing_id) AS [schema]
                      ,referencing_entity.name
                      ,CASE referencing_entity.type 
                           WHEN 'V' THEN N'VIEW'
                           ELSE /*IF, FN, TF*/ N'FUNCTION'
                       END as [type]
                FROM sys.sql_expression_dependencies AS dep
                    INNER JOIN sys.objects AS referencing_entity 
                        ON dep.referencing_id = referencing_entity.object_id
                WHERE dep.referenced_entity_name = @EntityName 
                      AND dep.referenced_schema_name = @SchemaName 
                      AND is_schema_bound_reference = 1
                      AND ((@ColumnName IS NULL AND dep.referenced_minor_id = 0) OR COL_NAME(dep.referenced_id, dep.referenced_minor_id) = @ColumnName)
            OPEN ReferencingEntitiesCursor
        
            FETCH NEXT FROM ReferencingEntitiesCursor
            INTO @ReferencingEntitySchema, @ReferencingEntityName, @ReferencingEntityType;
        
            WHILE @@FETCH_STATUS = 0
            BEGIN
                EXEC dbo.USP_DROP_ENFORCED_DEPENDENCIES @SchemaName=@ReferencingEntitySchema, @EntityName=@ReferencingEntityName, @Debug=@Debug;
                --The goal is to produce the following script:
                /*
                DROP FUNCTION dbo.UFN_SOME_FUNCTION;
                OR
                DROP VIEW dbo.UFN_SOME_VIEW;
                */
                SET @SqlScript = N'DROP ' + @ReferencingEntityType + N' ' + @ReferencingEntitySchema + '.' + @ReferencingEntityName;
                IF(@Debug = 1)
                    RAISERROR (@SqlScript, 0/*severity*/, 0/*state*/) WITH NOWAIT;
                EXEC (@SqlScript);
        
                FETCH NEXT FROM ReferencingEntitiesCursor
                INTO @ReferencingEntitySchema, @ReferencingEntityName, @ReferencingEntityType;
            END
        
            CLOSE ReferencingEntitiesCursor;
            DEALLOCATE ReferencingEntitiesCursor;       
        END
        GO
        

        【讨论】:

        • 我对 TABLE检查约束,而不是 COLUMN。例如:CREATE TABLE [zzzz]( [Id] [int] NOT NULL, [NumTotal] [int] NOT NULL, [NumUsadas] [int] default 0 NOT NULL, CONSTRAINT CK_zzzz CHECK (NumUsadas <= NumTotal AND NumTotal >= 0), PRIMARY KEY (Id) )
        【解决方案4】:

        在 SQL Server 对象浏览器中,右键单击存在问题的表并选择 View Dependencies。接下来在列出的视图中,右键单击(视图)并在 New SQL Query Editor 窗口中选择 SCRIPT to CREATE VIEW,然后从 CREATE VIEW t-sql 脚本中删除 WITH SCHEMABINDING 并运行修改后的 CREATE VIEW t-sql。这从表中取消了模式依赖项的链接。此时我能够重新创建表(DROP、RENAME 等)。

        注意:

        模式绑定可以发生在您数据库中的函数和其他对象上。 在抛出错误的对象上使用View Dependencies 是必不可少的 解决问题。

        顺便说一句:

        我最初添加了模式绑定来启用视图索引。保持一个 基础表上的良好索引可能会减轻性能损失 没有一个在视图中。

        1. View Dependencies
        2. More on Schema Binding

        【讨论】:

          【解决方案5】:

          我遇到了这样的问题。我删除了这个 DB 对象的约束,重命名了 DB 对象,然后重新创建了这些约束。这解决了我的问题。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-02-18
            • 2017-04-27
            • 1970-01-01
            • 1970-01-01
            • 2013-11-05
            • 2018-07-29
            相关资源
            最近更新 更多