Muitas vezes precisamos que uma determinada coluna receba um valor padrão, por exemplo, uma tabela de pedidos que, ao inserir um registro novo, coloca por padrão a data atual no campo que referencia a data do pedido.
Ok, mas como é que eu faço isso?
Muito simples, pequeno gafanhoto, ao criar uma tabela:
1 2 3 4 5 6 7 |
CREATE TABLE MinhaTabela ( Codigo int identity, Nome varchar(100) NOT NULL, Valor int NOT NULL, Data datetime not null CONSTRAINT DF_MinhaTabela_Data default getdate() ) |
Putz! Mas o campo Valor também tinha que ter um valor Default… Será que eu consigo colocar sem ter que refazer a criação ou dropar a coluna?
Claro…
1 2 3 |
ALTER TABLE MinhaTabela ADD CONSTRAINT DF_MinhaTabela_Valor DEFAULT 0 FOR Valor |
Reparem o que aparece ao executar um sp_help:
Massa né? Tudo bonito!
O Problema é quando, ao invés do código acima, executam isso:
1 2 |
ALTER TABLE MinhaTabelaBugada ADD DEFAULT 0 FOR Valor |
Notaram a diferença? Não foi especificado o nome da constraint Default…
Vejam como fica o nome dela quando isso ocorre:
Viram? Digamos que “DF__MinhaTabe__Valor__4A7F2436” não seja um nome bom para uma constraint (e esse nome pode ser muito pior dependendo do tamanho do nome da tabela e da coluna). Sem contar que o sequencial no final é randomico, ou seja, pra mim foi esse valor. Para você, será outro.
Pensando no caso onde o banco vá para n clientes e seja preciso realizar uma alteração no campo que possui essa constraint, a primeira coisa que deve ser feita é dropar essa constraint, alterar a definição da coluna e então recriar a constraint… E aí, como faz?
Toda essa lenga-lenga foi para chegar onde eu queria… 🙂
Fiz um script bem simples para pegar todas as constraints default de um determinado banco que esteja fora da nomenclatura “padrão” (que eu considero boa) DF_Tabela_Coluna para então deixar da forma como precisamos:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
DECLARE @Default_Correto varchar(100) DECLARE @Nome_Objeto varchar(100) DECLARE @Nome_Coluna varchar(100) DECLARE @Default_Errado varchar(100) DECLARE @Default_Definicao varchar(100) DECLARE @Comando varchar(150) DECLARE Cur_AjustaDF Cursor FOR select 'DF_' + OBJ.name + '_' + COL.name AS NomeCorreto, OBJ.Name, col.name, DEF.name, DEF.DEFINITION from sys.columns COL join sys.default_constraints DEF ON (COL.object_id = DEF.parent_object_id) AND (COL.column_id = DEF.parent_column_id) join sys.objects OBJ ON (COL.object_id = OBJ.object_id) where (DEF.is_system_named = 1) AND (OBJ.is_ms_shipped = 0) AND (OBJ.type = 'U') OPEN Cur_AjustaDF FETCH NEXT FROM Cur_AjustaDF INTO @Default_Correto, @Nome_Objeto, @Nome_Coluna, @Default_Errado, @Default_Definicao WHILE @@FETCH_STATUS = 0 BEGIN SET @Comando = ' ALTER TABLE ' + @Nome_Objeto + ' DROP CONSTRAINT ' + @Default_Errado EXEC (@Comando) SET @Comando = 'ALTER TABLE '+ @Nome_Objeto + ' ADD CONSTRAINT ' + @Default_Correto + ' DEFAULT ' + @Default_Definicao + ' FOR ' + @Nome_Coluna EXEC (@Comando) FETCH NEXT FROM Cur_AjustaDF INTO @Default_Correto, @Nome_Objeto, @Nome_Coluna, @Default_Errado, @Default_Definicao END CLOSE Cur_AjustaDF DEALLOCATE Cur_AjustaDF |
Após executar o script acima, a execução do “sp_help MinhaTabela” mostrará a constraint nomeada corretamente…
Caso queiram baixar para ver/brincar/usar, coloquei os scripts aqui
Qualquer comentário a respeito, inclusive melhorias (que muito provavelmente devem existir), façam. 😉
[]’s!