2009-10-08 4 views
16

Comment forcer un changement de nom ???sql nouveau nom de table de force 2005 qui a des dépendances

Renommer a échoué pour le tableau « dbo.x. (Microsoft.SqlServer.Smo)

Pour de l'aide, cliquez sur: 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


Une exception est survenue lors de l'exécution d'une instruction Transact-SQL ou par lots. (Microsoft.SqlServer.ConnectionInfo)


Object '[dbo]. [X]' ne peut pas être renommé parce que l'objet participe à des dépendances appliquées. (Microsoft SQL Server, erreur: 15336)

Pour de l'aide, cliquez sur: http://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&ProdVer=09.00.4035&EvtSrc=MSSQLServer&EvtID=15336&LinkId=20476

Répondre

39

Trouver les "dépendances appliquées", puis supprimer ou de les désactiver.

Par « dépendances forcée », cela signifie que la liaison de schéma, de sorte que vous aurez à regarder spécifiquement pour cela.

Voici une requête pour rechercher des références de liaison de schéma à votre objet:

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 

Comme je l'ai indiqué dans les commentaires, il n'y a pas manière à force ibly passer outre le schéma de liaison. Lorsque vous utilisez le schéma de liaison, vous dire explicitement « Ne pas laissez-moi ou quelqu'un d'autre remplacer ce. » La seule façon de contourner le schéma est de l'annuler, et c'est intentionnel.

+0

Note: * FORCE *, curieux de savoir s'il peut être fait –

+2

Notez ma réponse. C'est correct, et la seule façon de le faire. Lorsque vous utilisez le schéma bindig, vous renoncez explicitement à tout moyen de le "FORCE". Vous devez d'abord annuler la liaison de schéma – RBarryYoung

0

J'ai eu un problème comme celui-ci. J'ai abandonné les contraintes sur cet objet DB, renommé l'objet DB puis recréé ces contraintes. Cela a résolu mon problème.

2

Essayez ceci:

/* 
    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 
+0

J'ai *** contrainte de vérification *** pour *** TABLE ***, pas pour ** COLONNE **. Par exemple: CREATE TABLE [zzzz] ( \t [Id] [int] NOT NULL, \t [NumTotal] [int] NOT NULL default, \t [NumUsadas] [int] 0 NOT NULL, \t CONTRAINTE CHECK CK_zzzz (NumUsadas <= NumTotal ET NumTotal> = 0), \t PRIMARY KEY (Id) ) ' – Kiquenet

4

J'ai eu le même problème, mon problème est que je possède un champ Calculée en utilisant la colonne je tente de renommer.

en exécutant la requête de la réponse choisie, j'ai pu dire qui avait des dépendances forcées, mais je ne pouvais pas voir exactement quel était le problème

Questions connexes