2009-10-08 26 views
16

Làm cách nào để ép buộc đổi tên ???sql 2005 đổi tên bảng lực có phụ thuộc

Đổi tên không thành công cho Bảng 'dbo.x. (Microsoft.SqlServer.Smo)

Để được trợ giúp, bấm: 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


Một ngoại lệ xảy ra trong khi thực hiện một tuyên bố Transact-SQL hoặc hàng loạt. (Microsoft.SqlServer.ConnectionInfo)


Không thể đổi tên đối tượng vì đối tượng tham gia vào các phụ thuộc bắt buộc. (Microsoft SQL Server, Error: 15.336)

Để được trợ giúp, bấm: http://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&ProdVer=09.00.4035&EvtSrc=MSSQLServer&EvtID=15336&LinkId=20476

Trả lời

39

Tìm các "phụ thuộc được thực thi", sau đó loại bỏ hoặc vô hiệu hóa chúng.

Bởi "phụ thuộc thực thi", điều đó có nghĩa là ràng buộc lược đồ, vì vậy bạn sẽ phải xem xét cụ thể cho điều đó.

Dưới đây là một truy vấn để tìm kiếm tài liệu tham khảo liên kết schema để đối tượng của bạn:

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 

Như tôi đã lưu ý trong các ý kiến, có khôngcách Để ép ibly ghi đè Schema Binding. Khi bạn sử dụng Ràng buộc lược đồ, bạn rõ ràng đang nói "Làm không phải cho phép tôi hoặc bất kỳ ai khác ghi đè điều này". Cách duy nhất xung quanh Schema Binding là để hoàn tác nó, và đó là cố ý.

+0

lưu ý là chính xác những gì: * FORCE *, tò mò nếu nó có thể được thực hiện –

+2

Lưu ý câu trả lời của tôi. Đó là chính xác, và cách duy nhất để làm điều đó. Khi bạn sử dụng ràng buộc lược đồ, bạn rõ ràng sẽ mất bất kỳ cách nào để "FORCE" nó. Trước tiên, bạn phải hoàn tác ràng buộc lược đồ – RBarryYoung

0

Tôi gặp sự cố như thế này. Tôi đã giảm các ràng buộc đối với đối tượng DB này, được đổi tên thành đối tượng DB sau đó tái tạo các ràng buộc này. Điều này giải quyết được vấn đề của tôi.

2

Hãy thử điều này:

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

Tôi có *** ràng buộc kiểm tra *** đối với *** TABLE ***, không phải cho ** COLUMN **. Ví dụ: 'CREATE TABLE [zzzz] ( \t [Id] [int] NOT NULL, \t [NUMTOTAL] [int] NOT NULL, \t [NumUsadas] [int] mặc định 0 NOT NULL, \t CONSTRAINT CK_zzzz KIỂM TRA (NumUsadas <= NumTotal AND NumTotal> = 0), \t KEY CHÍNH (Id) ) ' – Kiquenet

4

tôi đã cùng một vấn đề, vấn đề của tôi là tôi có một lĩnh vực tính toán bằng cách sử dụng cột tôi đã cố gắng để đổi tên.

bằng cách chạy các truy vấn từ các câu trả lời được lựa chọn tôi đã có thể nói rằng đã có phụ thuộc được thực thi, nhưng tôi đã không thể để xem vấn đề

Các vấn đề liên quan