válido - Eliminar la restricción predeterminada en una columna en TSQL
restriccion check sql server (3)
Tengo una tabla con una columna como esta que está actualmente en vivo:
name NVARCHAR(128) NOT NULL DEFAULT ''''
Estoy alterando la columna de esta manera para que sea nulo:
ALTER TABLE mytable ALTER COLUMN name NVARCHAR(128) NULL
Sin embargo, la restricción predeterminada, llamada ''DF__mytable__datab__7DE4B36'' en una instancia de la tabla, aún permanece. Sé que esto podría haberse evitado si el autor original mencionara la restricción. Tengo varias instancias de estas tablas, pero no quiero eliminar manualmente todas las restricciones en cada tabla que tengo. ¿Cuál es la manera más fácil y elegante de eliminar esta restricción predeterminada en una columna en el servidor SQL que puedo aplicar uniformemente a cada instancia de esta tabla?
EDITAR
Esta es la secuencia de comandos que terminé usando:
DECLARE @table_id AS INT
DECLARE @name_column_id AS INT
DECLARE @sql nvarchar(255)
-- Find table id
SET @table_id = OBJECT_ID(''mytable'')
-- Find name column id
SELECT @name_column_id = column_id
FROM sys.columns
WHERE object_id = @table_id
AND name = ''name''
-- Remove default constraint from name column
SELECT @sql = ''ALTER TABLE mytable DROP CONSTRAINT '' + D.name
FROM sys.default_constraints AS D
WHERE D.parent_object_id = @table_id
AND D.parent_column_id = @name_column_id
EXECUTE sp_executesql @sql
Otra secuencia de comandos que se puede utilizar para lograr esto se puede encontrar aquí: ¿Cómo eliminar la restricción predeterminada de SQL sin conocer su nombre?
Gracias, Mohammed
Así es como eliminarías la restricción
ALTER TABLE <schema_name, sysname, dbo>.<table_name, sysname, table_name>
DROP CONSTRAINT <default_constraint_name, sysname, default_constraint_name>
GO
Con un script
-- t-sql scriptlet to drop all constraints on a table
DECLARE @database nvarchar(50)
DECLARE @table nvarchar(50)
set @database = ''dotnetnuke''
set @table = ''tabs''
DECLARE @sql nvarchar(255)
WHILE EXISTS(select * from INFORMATION_SCHEMA.TABLE_CONSTRAINTS where constraint_catalog = @database and table_name = @table)
BEGIN
select @sql = ''ALTER TABLE '' + @table + '' DROP CONSTRAINT '' + CONSTRAINT_NAME
from INFORMATION_SCHEMA.TABLE_CONSTRAINTS
where constraint_catalog = @database and
table_name = @table
exec sp_executesql @sql
END
Los créditos van a Jon Galloway http://weblogs.asp.net/jgalloway/archive/2006/04/12/442616.aspx
Yo sugeriría:
DECLARE @sqlStatement nvarchar(MAX),
@tableName nvarchar(50) = ''TripEvent'',
@columnName nvarchar(50) = ''CreatedDate'';
SELECT @sqlStatement = ''ALTER TABLE '' + @tableName + '' DROP CONSTRAINT '' + dc.name + '';''
FROM sys.default_constraints AS dc
LEFT JOIN sys.columns AS sc
ON (dc.parent_column_id = sc.column_id)
WHERE dc.parent_object_id = OBJECT_ID(@tableName)
AND type_desc = ''DEFAULT_CONSTRAINT''
AND sc.name = @columnName
PRINT'' [''+@tableName+'']:''+@@SERVERNAME+''.''+DB_NAME()+''@''+CONVERT(VarChar, GETDATE(), 127)+''; ''+@sqlStatement;
IF(LEN(@sqlStatement)>0)EXEC sp_executesql @sqlStatement
Me gustaría referirme a una pregunta anterior, porque he enfrentado el mismo problema y lo he solucionado con esta solución . En primer lugar, una restricción siempre se genera con un valor Hash
en su nombre. Entonces, el problema es que este HASH
varía en diferentes máquinas o bases de datos. Por ejemplo DF__Companies__IsGlo__6AB17FE4
aquí 6AB17FE4
es el valor hash (8 bit). Así que me refiero a un solo guión que será fructífero para todos
DECLARE @Command NVARCHAR(MAX)
declare @table_name nvarchar(256)
declare @col_name nvarchar(256)
set @table_name = N''ProcedureAlerts''
set @col_name = N''EmailSent''
select @Command =''Alter Table dbo.ProcedureAlerts Drop Constraint ['' + ( select d.name
from
sys.tables t
join sys.default_constraints d on d.parent_object_id = t.object_id
join sys.columns c on c.object_id = t.object_id
and c.column_id = d.parent_column_id
where
t.name = @table_name
and c.name = @col_name) + '']''
--print @Command
exec sp_executesql @Command
Soltará tu restricción predeterminada. Sin embargo, si quieres volver a crearlo, simplemente prueba esto
ALTER TABLE [dbo].[ProcedureAlerts] ADD DEFAULT((0)) FOR [EmailSent]
Finalmente, simplemente ejecute un comando DROP
para soltar la columna.