Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Wstaw MySQL ON DUPLICATE KEY do tabeli audytu lub dziennika

Jeśli chcesz rozważyć użycie procedury składowanej, możesz użyć DECLARE CONTINUE HANDLER . Oto przykład:

CREATE TABLE users (
    username    VARCHAR(30), 
    first_name  VARCHAR(30), 
    last_name   VARCHAR(30),
    PRIMARY KEY (username)
);

CREATE TABLE audit_table (timestamp datetime, description varchar(255));

DELIMITER $$
CREATE PROCEDURE add_user 
       (in_username    VARCHAR(30),
        in_first_name  VARCHAR(30),
        in_last_name   VARCHAR(30))
    MODIFIES SQL DATA
BEGIN
    DECLARE duplicate_key INT DEFAULT 0;
    BEGIN
        DECLARE EXIT HANDLER FOR 1062 SET duplicate_key = 1;

        INSERT INTO users (username, first_name, last_name)
               VALUES (in_username, in_first_name, in_last_name);
    END;

    IF duplicate_key = 1 THEN
        INSERT INTO audit_table VALUES(NOW(), 'Duplicate key ignored');
    END IF;
END$$
DELIMITER ;

Dodajmy trochę danych, próbując wstawić zduplikowany klucz:

CALL add_user('userA', 'Bob', 'Smith');
CALL add_user('userB', 'Paul', 'Green');
CALL add_user('userA', 'Jack', 'Brown');

Wynik:

SELECT * FROM users;
+----------+------------+-----------+
| username | first_name | last_name |
+----------+------------+-----------+
| userA    | Bob        | Smith     |
| userB    | Paul       | Green     |
+----------+------------+-----------+
2 rows in set (0.00 sec)

SELECT * FROM audit_table;
+---------------------+-----------------------+
| timestamp           | description           |
+---------------------+-----------------------+
| 2010-10-07 20:17:35 | Duplicate key ignored |
+---------------------+-----------------------+
1 row in set (0.00 sec)

Jeśli audyt jest ważny na poziomie bazy danych, możesz zechcieć przyznać EXECUTE uprawnienia tylko, aby użytkownicy Twojej bazy danych mogli wywoływać tylko procedury składowane.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak kosztowne są JOIN w SQL? I/lub jaki jest kompromis między wydajnością a normalizacją?

  2. Skrypt wsadowy systemu Windows do tworzenia kopii zapasowych lokalnych baz danych MySQL i zachowywania tylko N najnowszych FOLDERÓW z plikami kopii zapasowej

  3. Wydajność MySQL:identyfikacja długich zapytań

  4. Środowisko pracy MySQL nie może połączyć się z serwerem bazy danych

  5. jak posortować kolejność LEFT JOIN w zapytaniu SQL?