query - transact sql if
sql 2005 force table rename que tiene dependencias (5)
Busque las "dependencias forzadas", luego elimínelas o deshabilítelas.
Por "dependencias forzadas", significa vinculación de esquema, por lo que tendrá que buscar específicamente eso.
Aquí hay una consulta para buscar referencias de enlace de esquema a su objeto:
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
Como señalé en los comentarios, no hay forma de anular de forma FORCEABLE el enlace de esquema. Cuando usa el enlace de esquema, está diciendo explícitamente "No permita que nadie ni yo invaliden esto". La única forma de evitar el enlace de esquema es deshacerlo, y eso es intencional.
¿Cómo se fuerza un cambio de nombre?
No se pudo cambiar el nombre para la tabla ''dbo.x. (Microsoft.SqlServer.Smo)
Para obtener ayuda, haga clic en: 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
Se produjo una excepción al ejecutar una instrucción o lote Transact-SQL. (Microsoft.SqlServer.ConnectionInfo)
El objeto ''[dbo]. [X]'' no puede ser renombrado porque el objeto participa en dependencias forzadas. (Microsoft SQL Server, Error: 15336)
Para obtener ayuda, haga clic en: http://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&ProdVer=09.00.4035&EvtSrc=MSSQLServer&EvtID=15336&LinkId=20476
En el Examinador de objetos de SQL Server, haga clic con el botón derecho en la tabla con el problema y seleccione View Dependencies
. A continuación, en la vista de la lista, haga clic con el botón derecho (ver) y seleccione SCRIPT para CREAR VISTA en la nueva ventana del Editor de consultas SQL, luego elimine WITH SCHEMABINDING
del script t-sql CREATE VIEW y ejecute el t-sql CREATE VIEW revisado. Esto desvincula la dependencia del esquema de la tabla. Pude recrear la tabla en este punto (DROP, RENAME, etc.).
Nota:
El enlace de esquema puede ocurrir en funciones y otros objetos en su db. El uso de
View Dependencies
deView Dependencies
en el objeto que produce el error es esencial para solucionar el problema.Por cierto:
Originalmente agregué enlace de esquema para habilitar la indexación de vista. Mantener un buen índice en la (s) tabla (s) subyacente (s) puede mitigar el impacto de rendimiento de no tener uno en la vista.
Prueba esto:
/*
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
Tuve el mismo problema, mi problema fue que tengo un CAMPO COMPUTADO utilizando la columna que estaba tratando de cambiar de nombre.
Al ejecutar la consulta de la respuesta seleccionada, pude decir que tenía dependencias forzadas, pero no pude ver exactamente cuál era el problema.
Tuve un problema como este. Solté restricciones en este objeto de base de datos, cambié el nombre del objeto de base de datos y luego volví a crear estas restricciones. Esto solucionó mi problema.