índice válido valor usarse una tipo tabla restriccion quitar que por permitir para modificar duplicados defecto como columna clave check campo alterar agregar sql sql-server database tsql

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.