SQL: Escribir un disparo que detiene una fila de ser insertado si la Persona es propietaria de una Tienda de

Tengo la siguiente tabla se llama Administrador:

Store   |   Person
ABC         Ms. Elara
XYZ         Mr. Saros
DEF         Ms. Orion

Estoy aprendiendo acerca de los disparadores en PostgreSQL y estoy tratando de escribir un trigger de la tabla anterior para revisar y rechazar cualquier inserción o actualización de una Persona en el Administrador de mesa para ser un gerente de más de una tienda.

Mi enfoque es que en la función de disparador, selecciona tuplas de la Gerente de la tabla, donde la Persona es igual a la Persona en la tupla usted está tratando de insertar. Si hay tuplas en el Administrador de mesa donde la Persona es igual a la Persona en la nueva tupla que se inserta, entonces la fila no se inserta.

No estoy seguro de cómo en la función de disparador puedo seleccionar todas las tuplas de Manager, donde la Persona es igual a la Persona a ser insertado. Cualquier conocimiento son apreciados.

2 Respuestas

  • Kaja Hussain
    4 de mayo de 2019

    ¿Por qué necesita un disparador para esto ? U puede escribir una postgres función que comprueba la existencia de una persona en particular antes de la inserción.

    Algo como esto,

    Create function check_person_exists(par_person_id int)
    Declare var_exists_flag int;
    Begin
    var_exists_flag =0;p
    
    Select 1 from table where person_id = par_person_id into var_exists_flag;
    If var_exists_flag = 0
    Then
    Insert into ....
    Else 
    Raise notice ' the records already exists';
    Return;
    End
    

    PS: en El código anterior, tendrá problemas de sintaxis .

  • GMc
    4 de mayo de 2019

    También se puede utilizar un único índice:

    CREATE UNIQUE INDEX Manager_IDX ON Manager (person);
    

    Esto también funciona si has probado a actualizar el nombre de una persona a un nombre que ya existe. También tendría la ventaja de hacer esto rápido para la consulta de la tabla por el nombre de una persona.

    Usted dijo que usted quería saber acerca de los desencadenadores, una manera de empezar podría ser un disparador (en realidad 3, un insert, update y delete trigger) en el administrador de que se mantiene automáticamente un registro histórico de los cambios (es decir, una pista de auditoría) en otra tabla (por ejemplo, manager_audit). La tabla de auditoría tendrá la definición de la misma como el Administrador de mesa, pero con al menos una columna adicional (por ejemplo, código de operación (opcode) que realiza un seguimiento de lo que la operación fue. por ejemplo, yo para insertar, D para Borrar, U para Actualizar. Usted podría también tener una marca de tiempo para grabar cuando la operación que pasó y de otros campos (por ejemplo, el id de usuario que hizo el cambio, etc).

    Habiendo dicho todo esto y para lo que vale la pena, la aplicación de la unicidad de cosas como el nombre podría no ser la mejor idea. Es enteramente posible que el Señor "Smith" podría ser el nombre de dos personas diferentes que esté trabajando en una gran empresa.