locked
Consejo sobre restricciones RRS feed

  • Pregunta

  • Hola, queria haceros una consulta sobre las restricciones que tengo que aplicar en mi sistema.
    Os comento:

    Tengo 3 tablas, todas tienen un campo que se llama "orden" y que es autonumerico en las 3.

    Me gustaria que en las 3 tablas los valores fuesen diferentes, es decir que fuesen UNIQUE entre las 3 tablas y no existiese un valor "orden" que ya este en otra tabla.

    Tambien queria preguntar si esos campos se les puede modificar posteriormente y manualmente (sin inclumplir la unicidad de las 3 tablas, claro esta).

    Muchas gracias, y si tienen alguna otra sugerencia...

    Un saludo
    martes, 27 de octubre de 2009 16:57

Respuestas

  • Hola.

    Entonces tendrás que crear tu propia gestión de contadores. No es especialmente complicado, pero ya no es un autonumérico que gestione el motor. Así, tendrás que crear una tabla con contadores y cada vez que necesites un nuevo valor (cada inserción en alguna de las tres tablas), llamar, por ejemplo, a un procedimiento almacenado que te proporcione dicho valor, aumentando en un el contador. Bien gestionado, no tendrás muchos problemas de bloqueos.

    Por otra parte, la restricción de que no se repitan los valores tendrás que montarla de forma independiente, no será una check constraint, si no algún proceso. No te recomiendo que lo hagas con un trigger de inserción que verifique si el valor a insertar existe en alguna de las otras dos tablas, aunque sería una forma si la concurrencia que tienes es muy baja.




    Alberto López Grande (Visita mi blog en http://qwalgrande.blogspot.es/)
    martes, 27 de octubre de 2009 17:50
    Moderador

Todas las respuestas

  • Hola.

    Para conseguir lo que te propones, utiliza rangos de valores en el autonumérico, es decir, que en cada tabla no puedan chocar (empiezas una tabla por 1.000.000, la siguiente por 2.000.000, etc). Adicionalmente puedes crear una restricción en cada tabla para que los valores no se salgan del rango atribuido. Para fijar el valor de inicio del identity, usa dbcc checkiden (http://msdn.microsoft.com/es-es/library/ms176057.aspx).

    Sobre la manipulación de esos valores, se pueden modificar (revisa "set identity_insert", http://msdn.microsoft.com/es-es/library/ms188059.aspx).



    Alberto López Grande (Visita mi blog en http://qwalgrande.blogspot.es/)
    martes, 27 de octubre de 2009 17:06
    Moderador
  • Gracias por el interes, yo tambien habia pensado en algo de eso, pero la cosa es que quiero que aunque en un principio se asignen en diferentes rangos, luego puedan coexistir todos juntos y con el mismo rango.

    El campo orden sirve para determinar el orden en que se van a ejecutar unas acciones. Pero las acciones son de 3 tipos diferentes y por lo tanto yo querria que se pudieran ejecutar indistintamente. EJ: orden = 1 --> perteneciente a la tabla 2           orden = 2 --> perteneciente a la tabla 3           orden = 3 ---> perteneciente a la tabla 1 etc...

    Asi para que cuando este asignadas por defecto, posteriormente pueda yo ordenarlas a mi gusto, con mi aplicacion.




    martes, 27 de octubre de 2009 17:18
  • Hola.

    Entonces tendrás que crear tu propia gestión de contadores. No es especialmente complicado, pero ya no es un autonumérico que gestione el motor. Así, tendrás que crear una tabla con contadores y cada vez que necesites un nuevo valor (cada inserción en alguna de las tres tablas), llamar, por ejemplo, a un procedimiento almacenado que te proporcione dicho valor, aumentando en un el contador. Bien gestionado, no tendrás muchos problemas de bloqueos.

    Por otra parte, la restricción de que no se repitan los valores tendrás que montarla de forma independiente, no será una check constraint, si no algún proceso. No te recomiendo que lo hagas con un trigger de inserción que verifique si el valor a insertar existe en alguna de las otras dos tablas, aunque sería una forma si la concurrencia que tienes es muy baja.




    Alberto López Grande (Visita mi blog en http://qwalgrande.blogspot.es/)
    martes, 27 de octubre de 2009 17:50
    Moderador