Подтвердить что ты не робот

Переименовать таблицу синтаксиса sql 2005, которая имеет зависимости

Как заставить переименовать???

Переименовать не удалось для таблицы 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)


Object '[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

4b9b3361

Ответ 1

Найдите "принудительные зависимости", затем удалите или отключите их.

В соответствии с "принудительными зависимостями" это означает привязку схемы, поэтому вам придется искать именно это.

Вот запрос поиска ссылок привязки схемы к вашему объекту:

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

Как я уже отмечал в комментариях, не существует возможности принудительно перекрывать привязку схемы. Когда вы используете привязку схемы, вы явно говорите: "Не позволяйте мне или кому-либо другому переопределять это". Единственный способ связать привязку схемы - это отменить его, и это намеренно.

Ответ 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 @[email protected], @[email protected], @[email protected];
        --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

Ответ 4

У меня была такая проблема. Я сбросил ограничения на этот объект БД, переименовал объект БД, а затем воссоздал эти ограничения. Это решило мою проблему.