SQL Server sql 2005强制重命名具有依赖项表

bxpogfeg  于 2022-12-03  发布在  其他
关注(0)|答案(6)|浏览(230)

如何强制重命名?
重命名表“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

mqkwyuun

mqkwyuun1#

找到“强制依赖关系”,然后删除或禁用它们。
“强制依赖关系”意味着模式绑定,因此您必须特别注意这一点。
下面是一个查询,用于查找对对象的架构绑定引用:

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

正如我在注解中所指出的,* 没有**方法 * 可以强制覆盖架构绑定。当您使用架构绑定时,您明确地说“不要 * 让我或任何其他人覆盖它。”解决架构绑定的唯一方法是撤消它,这是有意的。

iswrvxsc

iswrvxsc2#

我遇到了同样的问题,我的问题是我有一个计算字段使用了我试图重命名的列。
通过从选定的答案运行查询,我能够判断出具有强制依赖关系,但我无法确切地看到问题所在

xmakbtuz

xmakbtuz3#

试试这个:

/*  
    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
cwtwac6a

cwtwac6a4#

在SQL Server对象浏览器中,以鼠标器右击按一下有问题的数据表,然后选取View Dependencies。(视图),然后在“新建SQL查询编辑器”窗口中选择“创建视图脚本”,然后从CREATEVIEWt-sql脚本中删除WITH SCHEMABINDING,并运行修改后的CREATEVIEWt-sql。这将取消架构依赖关系与表的链接。我能够在此时重新创建表(DROP、RENAME等)。
注意事项:
数据库中的函数和其他对象可能会发生架构绑定。在引发错误的对象上使用View Dependencies对于解决此问题至关重要。
顺便说一句:
我最初添加模式绑定是为了启用视图索引。在底层表上保留一个好的索引可以减轻在视图上没有索引时对性能的影响。

  1. View Dependencies
  2. More on Schema Binding
kpbpu008

kpbpu0085#

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

t5fffqht

t5fffqht6#

我使用这个脚本来获取具有架构的依赖视图:

select distinct o.name, o.type from sys.sql_expression_dependencies dep inner join sys.objects o on dep.referencing_id=o.object_id where referenced_id = OBJECT_ID(<your dependency owner object>) and o.type = 'V'

相关问题