Si está buscando duplicar la conveniencia de tener una clave INT única asignada automáticamente al insertarla, puede agregar un disparador INSTEAD OF INSERT
que use MAX de la columna existente +1 para determinar el siguiente valor.
Si la columna con el valor de identidad es la primera clave en un índice, la consulta MAX será una simple búsqueda de índice, muy eficiente.
Las transacciones asegurarán que se asignan valores únicos, pero este enfoque tendrá una semántica de bloqueo diferente a la columna de identidad estándar. IIRC, SQL Server puede asignar un valor de identidad diferente para cada transacción que lo solicita en paralelo y, si se retrotrae una transacción, se descartan los valores asignados. El enfoque MAX solo permitiría que una transacción inserte filas en la tabla a la vez.
Un enfoque relacionado podría ser tener una tabla de valores de clave dedicada codificada por el nombre de la tabla, el ID del inquilino y el valor de identidad actual. Se requeriría el mismo activador INSTEAD OF INSERT
y más repetitivo para consultar y mantener actualizada esa tabla de claves. Sin embargo, no mejoraría las operaciones paralelas; la cerradura solo estaría en el registro de otra mesa.
Una posibilidad de corregir el cuello de botella de bloqueo sería incluir el SPID actual en el valor de la clave (ahora la clave de identidad es una combinación de int secuencial y cualquier SPID que ocurra para asignarlo y no simplemente secuencial), use la identidad dedicada tabla de valores e inserte registros allí por SPID según sea necesario; la tabla de identidad PK sería (nombre de la tabla, inquilino, SPID) y tiene una columna que no es clave con el valor secuencial actual. De esta forma, cada SPID tendría su propio conjunto de identidades dinámicamente asignado y solo tendría sus propios registros específicos de SPID bloqueados.
Otro inconveniente es mantener activadores que deben actualizarse cada vez que cambie las columnas en cualquiera de las tablas de identidades especiales.
"Realmente no quiero que los valores clave incrementales de sustitución sangren entre los clientes ..." Tengo curiosidad, ¿por qué no quieres que esto suceda? –
Principalmente porque le dará a la gente una idea de cuántas filas estoy manejando, en mi mundo utópico deberían estar completamente cerradas unas a otras –
De hecho, puede tener ambas: clave primaria sustituta para la integridad referencial (oculta a los clientes) y los índices únicos de dos columnas, por ejemplo: (Cust_id, Order_Number) – alexm