переименование таблицы принудительного использования SQL Server 2005 с зависимостями - PullRequest
23 голосов
/ 09 октября 2009

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

Не удалось переименовать таблицу '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

Ответы [ 5 ]

45 голосов
/ 09 октября 2009

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

Под «принудительными зависимостями» подразумевается привязка схемы, поэтому вам придется искать именно это.

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

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

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

4 голосов
/ 09 октября 2016

У меня была та же проблема, моя проблема заключалась в том, что у меня есть ВЫЧИСЛЕННОЕ ПОЛЕ, использующее столбец, который я пытался переименовать.

запустив запрос из выбранного ответа, я смог сказать, что у него есть принудительные зависимости, но я не смог точно понять, в чем была проблема

3 голосов
/ 18 марта 2015

Попробуйте это:

/*  
    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
1 голос
/ 03 мая 2018

В обозревателе объектов SQL Server щелкните правой кнопкой мыши таблицу с проблемой и выберите View Dependencies. Далее в представлении из списка щелкните правой кнопкой мыши (view) и выберите SCRIPT для CREATE VIEW в окне New SQL Query Editor, затем удалите WITH SCHEMABINDING из сценария CREATE VIEW t-sql и запустите исправленный CREATE VIEW t-SQL. Это освобождает зависимость схемы от таблицы. На этом этапе я смог воссоздать таблицу (DROP, RENAME и т. Д.).

Примечание:

Связывание схемы может происходить с функциями и другими объектами в вашей базе данных. Использование View Dependencies на объекте, выдавшем ошибку, необходимо чтобы исправить проблему.

КСТАТИ:

Первоначально я добавил привязку схемы для включения индексации представления. Держать хороший индекс в базовой таблице (таблицах) может снизить производительность не иметь на виду.

  1. Просмотр зависимостей
  2. Подробнее о привязке схемы
0 голосов
/ 08 апреля 2013

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...