studio standard sp2 microsoft management instalar descargar como sql-server sql-server-2008

sql-server - standard - sql server 2014



Cómo soltar la columna con restricción? (6)

Aquí hay otra forma de eliminar una restricción predeterminada con un nombre desconocido sin tener que ejecutar primero una consulta por separado para obtener el nombre de la restricción:

DECLARE @ConstraintName nvarchar(200) SELECT @ConstraintName = Name FROM SYS.DEFAULT_CONSTRAINTS WHERE PARENT_OBJECT_ID = OBJECT_ID(''__TableName__'') AND PARENT_COLUMN_ID = (SELECT column_id FROM sys.columns WHERE NAME = N''__ColumnName__'' AND object_id = OBJECT_ID(N''__TableName__'')) IF @ConstraintName IS NOT NULL EXEC(''ALTER TABLE __TableName__ DROP CONSTRAINT '' + @ConstraintName)

¿Cómo descartar una columna que tiene restricción predeterminada en SQL Server 2008?

Mi consulta es

alter table tbloffers drop column checkin

Estoy obteniendo el error debajo

ALTER TABLE DROP COLUMN checkin failed porque uno o más objetos acceden a esta columna.

¿Alguien puede corregir mi consulta para descartar una columna con restricción?


Encuentre la restricción predeterminada con esta consulta aquí:

SELECT df.name ''Constraint Name'' , t.name ''Table Name'', c.NAME ''Column Name'' FROM sys.default_constraints df INNER JOIN sys.tables t ON df.parent_object_id = t.object_id INNER JOIN sys.columns c ON df.parent_object_id = c.object_id AND df.parent_column_id = c.column_id

Esto le da el nombre de la restricción predeterminada, así como el nombre de la tabla y columna.

Cuando tenga esa información, primero debe soltar la restricción predeterminada:

ALTER TABLE dbo.YourTable DROP CONSTRAINT name-of-the-default-constraint-here

y luego puedes soltar la columna

ALTER TABLE dbo.YourTable DROP COLUMN YourColumn


Lo siguiente funcionó para mí contra un backend SQL Azure (usando SQL Server Management Studio), entonces YMMV, pero, si funciona para usted, es más simple que las otras soluciones.

ALTER TABLE MyTable DROP CONSTRAINT FK_MyColumn CONSTRAINT DK_MyColumn -- etc... COLUMN MyColumn GO


Primero debe eliminar la DEFAULT constraint problemática DEFAULT constraint , después de eso puede soltar la columna

alter table tbloffers drop constraint [ConstraintName] go alter table tbloffers drop column checkin

Pero el error puede aparecer por otros motivos, por ejemplo, la función definida por el usuario o la vista con la opción SCHEMABINDING establecida para ellos.

UPD: secuencia de comandos de caída completamente automatizada de restricciones:

DECLARE @sql NVARCHAR(MAX) WHILE 1=1 BEGIN SELECT TOP 1 @sql = N''alter table tbloffers drop constraint [''+dc.NAME+N'']'' from sys.default_constraints dc JOIN sys.columns c ON c.default_object_id = dc.object_id WHERE dc.parent_object_id = OBJECT_ID(''tbloffers'') AND c.name = N''checkin'' IF @@ROWCOUNT = 0 BREAK EXEC (@sql) END


También puede soltar la columna y su (s) restricción (es) en una sola declaración en lugar de individualmente.

CREATE TABLE #T ( Col1 INT CONSTRAINT UQ UNIQUE CONSTRAINT CK CHECK (Col1 > 5), Col2 INT ) ALTER TABLE #T DROP CONSTRAINT UQ , CONSTRAINT CK, COLUMN Col1 DROP TABLE #T

Algunos SQL dinámicos que buscarán los nombres de las restricciones de verificación dependientes y las restricciones predeterminadas y los colocarán junto con la columna están debajo

(pero no otras posibles dependencias de columna como claves externas, restricciones de clave únicas y principales, columnas calculadas, índices)

CREATE TABLE [dbo].[TestTable] ( A INT DEFAULT ''1'' CHECK (A=1), B INT, CHECK (A > B) ) GO DECLARE @TwoPartTableNameQuoted nvarchar(500) = ''[dbo].[TestTable]'', @ColumnNameUnQuoted sysname = ''A'', @DynSQL NVARCHAR(MAX); SELECT @DynSQL = ''ALTER TABLE '' + @TwoPartTableNameQuoted + '' DROP'' + ISNULL('' CONSTRAINT '' + QUOTENAME(OBJECT_NAME(c.default_object_id)) + '','','''') + ISNULL(check_constraints,'''') + '' COLUMN '' + QUOTENAME(@ColumnNameUnQuoted) FROM sys.columns c CROSS APPLY (SELECT '' CONSTRAINT '' + QUOTENAME(OBJECT_NAME(referencing_id)) + '','' FROM sys.sql_expression_dependencies WHERE referenced_id = c.object_id AND referenced_minor_id = c.column_id AND OBJECTPROPERTYEX(referencing_id, ''BaseType'') = ''C'' FOR XML PATH('''')) ck(check_constraints) WHERE c.object_id = object_id(@TwoPartTableNameQuoted) AND c.name = @ColumnNameUnQuoted; PRINT @DynSQL; EXEC (@DynSQL);


Tengo lo mismo:

ALTER TABLE DROP COLUMN falló porque uno o más objetos tienen acceso a este mensaje de columna .

Mi columna tenía un índice que primero debía borrarse. Usar sys.indexes hizo el truco:

DECLARE @sql VARCHAR(max) SELECT @sql = ''DROP INDEX '' + idx.NAME + '' ON tblName'' FROM sys.indexes idx INNER JOIN sys.tables tbl ON idx.object_id = tbl.object_id INNER JOIN sys.index_columns idxCol ON idx.index_id = idxCol.index_id INNER JOIN sys.columns col ON idxCol.column_id = col.column_id WHERE idx.type <> 0 AND tbl.NAME = ''tblName'' AND col.NAME = ''colName'' EXEC sp_executeSql @sql GO ALTER TABLE tblName DROP COLUMN colName