O SQL Server requer que o usuário tenha permissões ALTER TABLE para inserir valores específicos em uma coluna IDENTITY.
Isso parece um pouco estranho, visto que as inserções são claramente uma operação DML.
Para explicar por que isso é um problema para mim, lembre-se primeiro de que os bancos de dados não revertem valores de identidade em uma reversão de transação. Isso ocorre porque os bancos de dados permitem a inserção simultânea de várias transações.
Portanto, se uma transação que inseriu uma linha posteriormente falhar e precisar ser repetida, pode-se reutilizar com segurança o valor de identidade já recuperado na primeira tentativa.
Estou escrevendo um editor de banco de dados e essa abordagem facilita a implementação de inserções complicadas: o usuário está construindo gradualmente um gráfico de linhas de tabela relacionadas para as quais as chaves são necessárias, mas as chaves são geradas pelo banco de dados. Os ORMs usam chaves temporárias para isso e reescrevem tudo após um commit, mas isso é obviamente mais difícil de implementar. É mais fácil sempre ir ao banco de dados para cada nova etapa de inserção, obter o valor de identidade e reverter. Somente quando o usuário clica em salvar no final, a transação é confirmada e os valores ainda devem estar corretos.
Isso funciona para alguns outros bancos de dados como MySQL e Postgres, mas o SQL Server tem a peculiaridade de precisar de um nível surpreendentemente alto de privilégio.
Minha pergunta é por que isso acontece e se isso pode ser indicativo de algum outro problema sobre a inserção explícita de valores de identidade que eu perdi até agora.
Não tenho uma fonte para o motivo, mas certamente o uso indiscriminado dessa facilidade pode causar problemas.
Como exemplo (assumindo
int
a coluna de identidade com incremento positivo), inserir explicitamente2147483647
como o valor de identidade fará com que todas as inserções subsequentes que dependem do incremento de identidade falhem até que alguém execute manualmente umRESEED
ou resolva a bagunça de outra maneira.Você pode usar a
SEQUENCE
em vez deIDENTITY
colunas para alocar o valor da coluna de chave substituta. E também não há necessidade de inserir a linha e revertê-la neste caso - basta obter o próximo valor da sequência.