2009-10-08 11 views
16

Jak wymusić zmianę nazwy ??sql 2005 wymuszenie zmiany nazwy tabeli, która ma zależności

Zmiana nazwy nie powiodła się dla tabeli "dbo.x. (Microsoft.SqlServer.Smo)

uzyskać pomoc, kliknij: 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


Wystąpił wyjątek podczas wykonywania instrukcji Transact-SQL lub partii. (Microsoft.SqlServer.ConnectionInfo)


obiekt '[dbo]. [X]' nie może zostać zmieniona, ponieważ obiekt bierze udział w wymuszonych zależności. (Microsoft SQL Server, Error: 15336)

uzyskać pomoc, kliknij: http://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&ProdVer=09.00.4035&EvtSrc=MSSQLServer&EvtID=15336&LinkId=20476

Odpowiedz

39

znaleźć "egzekwowane zależności", a następnie usunąć lub wyłączyć je.

Przez "wymuszone zależności", oznacza to powiązanie schematu, więc będziesz musiał szukać konkretnie tego.

Oto zapytanie szukać wiązanie schematu referencji do obiektu:

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 

Jak zauważył w komentarzach, nie ma niesposób zmusić-ibly przesłonić Schema Binding. Podczas korzystania z powiązania schematu wyraźnie mówisz "Do , a nie pozwól mi lub ktokolwiek inny nadpisać to." Jedynym sposobem związania Schema Binding jest jego cofnięcie, a to jest zamierzone.

+0

uwaga: * SIŁA *, ciekawy, czy można to zrobić –

+2

Zauważ moją odpowiedź. Jest poprawny i jedyny sposób, aby to zrobić. Gdy używasz bindowania schematu, wyraźnie tracisz możliwość "wymuszania" go. Najpierw należy cofnąć powiązanie schematu. – RBarryYoung

0

Miałem taki problem. Zrzuciłem ograniczenia na ten obiekt DB, zmieniono nazwę obiektu DB, a następnie odtworzono te ograniczenia. To rozwiązało mój problem.

2

Spróbuj tego:

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

Mam ograniczenie *** sprawdzenia *** dla *** TABELA ***, a nie dla ** KOLUMNA **. Np: 'CREATE TABLE [ZZZZ] ( \t [id] [int] NOT NULL, \t [NumTotal] [int] NOT NULL, \t [NumUsadas] [int] domyślną 0 NOT NULL, \t CONSTRAINT CK_zzzz wyboru (NumUsadas <= NumTotal AND NumTotal> = 0), \t PRIMARY KEY (Id) ) ' – Kiquenet

4

miałem ten sam problem, moim problemem było to, że ma obliczone pole przy użyciu kolumny starałem się zmienić.

uruchamiając zapytanie z wybraną odpowiedź byłem w stanie powiedzieć, że miał egzekwowane zależności, ale nie był w stanie zobaczyć dokładnie to, co było problemem

Powiązane problemy