una - restriccion check sql server
¿Cómo se elimina un valor predeterminado o una restricción similar en T-SQL? (6)
Sé la sintaxis:
ALTER TABLE [TheTable] DROP CONSTRAINT [TheDefaultConstraint]
pero ¿cómo puedo soltar la restricción predeterminada cuando no sé su nombre? (Es decir, se autogeneró en CREATE TABLE
time).
Aquí va mi propia versión que descarta todas las restricciones dependientes: restricción predeterminada (si existe) y todas las restricciones de comprobación afectadas (como parece sugerir el estándar SQL y como algunas otras bases de datos lo parecen)
declare @constraints varchar(4000);
declare @sql varchar(4000);
with table_id_column_position as (
select object_id table_id, column_id column_position
from sys.columns where object_id is not null and object_id = object_id(''TableName'') and name = ''ColumnToBeDropped''
)
select @constraints = coalesce(@constraints, ''constraint '') + ''['' + name + ''], ''
from sysobjects
where (
-- is CHECK constraint
type = ''C''
-- dependeds on the column
and id is not null
and id in (
select object_id --, object_name(object_id)
from sys.sql_dependencies, table_id_column_position
where object_id is not null
and referenced_major_id = table_id_column_position.table_id
and referenced_minor_id = table_id_column_position.column_position
)
) OR (
-- is DEFAULT constraint
type = ''D''
and id is not null
and id in (
select object_id
from sys.default_constraints, table_id_column_position
where object_id is not null
and parent_object_id = table_id_column_position.table_id
and parent_column_id = table_id_column_position.column_position
)
);
set @sql = ''alter table TableName drop '' + coalesce(@constraints, '''') + '' column ColumnToBeDropped'';
exec @sql
(Cuidado: tanto TableName
como ColumnToBeDropped
aparecen dos veces en el código anterior)
Esto funciona construyendo una sola ALTER TABLE TableName DROP CONSTRAINT c1, ..., COLUMN ColumnToBeDropped
y ejecutándola.
O puede encontrarlo utilizando la vista de catálogo sys.check_constraints.
Para una sola tabla y columna en una sola línea, use la siguiente
declare @sql nvarchar(max); set @sql = ''''; SELECT @sql+=''ALTER TABLE [dbo].[YOURTABLENAME] DROP CONSTRAINT '' + ((SELECT OBJECT_NAME(constid) FROM sysconstraints WHERE OBJECT_NAME(id) = ''YOURTABLENAME''AND colid IN (SELECT ORDINAL_POSITION FROM INFORMATION_SCHEMA.COLUMNS Where Table_Name = ''YOURTABLENAME'' and COLUMN_NAME = ''YOURCOLUMNNAM''))) + '';''; EXEC sp_executesql @sql;
Si tiene múltiples restricciones en la columna, tendrá que discriminar sobre la restricción que está buscando, pero si tiene una restricción predeterminada, esto hará el truco.
Consulte las otras columnas disponibles en el esquema de información para que pueda seguir discriminando.
Puede encontrar el nombre de la restricción mediante sp_help [nombre de tabla] y luego soltarlo por su nombre.
O puede hacerlo a través de Management Studio.
Puede usar este código para hacerlo automáticamente:
DECLARE @tableName VARCHAR(MAX) = ''<MYTABLENAME>''
DECLARE @columnName VARCHAR(MAX) = ''<MYCOLUMNAME>''
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 = @columnName AND object_id = OBJECT_ID(@tableName))
IF @ConstraintName IS NOT NULL
EXEC(''ALTER TABLE ''+@tableName+'' DROP CONSTRAINT '' + @ConstraintName)
Simplemente reemplace <MYTABLENAME>
y <MYCOLUMNNAME>
según corresponda.
Si desea hacer esto manualmente, puede usar Management Studio para encontrarlo (debajo del nodo Restricciones dentro de la tabla).
Para hacerlo usando SQL:
Si las restricciones son restricciones predeterminadas, puede usar
sys.default_constraints
para encontrarlo:SELECT OBJECT_NAME(parent_object_id) AS TableName, name AS ConstraintName FROM sys.default_constraints ORDER BY TableName, ConstraintName
Si también está buscando otras restricciones (verificación, única, clave externa, predeterminada, clave principal), puede usar
sysconstraints
:SELECT OBJECT_NAME(id) AS TableName, OBJECT_NAME(constid) AS ConstraintName FROM sysconstraints ORDER BY TableName, ConstraintName
No dice qué versión de SQL Server está utilizando. El trabajo anterior en SQL 2005 y SQL 2008.