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.