Datenbank-Zeichensatz
Hier hilft das Einstellen einer anderen Codepage, auch über PHPMyAdmin.
Code:
SET SESSION CHARACTER_SET_RESULTS =latin1;
SET SESSION CHARACTER_SET_CLIENT =latin1;
Mehrbenutzerfähigkeit für Internetanwendungen
Hier gib es de Möglichkeit den aktuell angemeldeten Benutzer in die Tabelle einzutragen. Zum Beispiel um späte eine Logik zu entwickeln, die Löschvorgänge auf selbst angelegte Datensätze beschränkt.
MySQL bietet hier die
USER()-Funktion an:
SELECT CURRENT_USER();.
Um den aktuellen Benutzer abzufragen kann man folgende Abfrage schicken:
Code:
SELECT SUBSTRING_INDEX(USER(),'@',1);
Man kann dann eine Log-Tabelle anlegen um Eintragungen zu protokolieren.
Code:
CREATE TABLE app_log
(
t TIMESTAMP,
user CHAR(16),
host CHAR(60)
);
Hier kann man mit einem Insert-Statement aktuellen USER und HOST eintragen. TIMESTAMP hat dabei die aktuelle Datum/Zeit-Kombination.
Code:
INSERT INTO app_log
SET user = SUBSTRING_INDEX(USER( ),'@',1),
host = SUBSTRING_INDEX(USER( ),'@',-1);
Oder man baut einen Trigger der den aktuellen User im Insert mit aufnimmt:
Code:
create database dbtest;
use dbtest;
grant all privileges on dbtest.* to 'testuser'@'
localhost';
create table test (creator varchar(30), modificator varchar(30), text varchar(100));
create trigger ins_test before insert on test for each row set new.modificator=current_user();
Jetzt kann verhindert werden, dass ein anderer User den eigenen Datensatz löscht. Das geht über einen Before-Delete Trigger:
Code:
DROP TRIGGER IF EXISTS users_anon;
delimiter |
CREATE TRIGGER users_anon BEFORE DELETE ON users
FOR EACH ROW BEGIN
-- Prevent deletion
IF (OLD.modificator <> user() ) THEN
-- This raises an
exception and prevents deletion
INSERT INTO users VALUES (OLD);
END IF;
END;
Man kann auch noch eine Audit/Log Tabelle führen und sehen wer gelöscht hat:
Code:
-- before delete trigger
CREATE OR REPLACE TRIGGER employee_before_delete
BEFORE DELETE
ON MyTable
FOR EACH ROW
DECLARE
v_username varchar2(10);
BEGIN
-- Find username of person performing the DELETE on the table
SELECT user INTO v_username
FROM dual;
-- Insert record into audit table
INSERT INTO table_audit (id, delete_date,deleted_by )
VALUES (:old.id, sysdate, v_username );
END;
Ziel der Geschichte ist eine Tabelle mehrbenutzerfähig im Internet verwalten zu können.
Etwas Feinabstimmung ist hier wohl noch drin.
Grüße in die Runde