2016-06-17 1 views
1
CREATE TRIGGER `table_triger_on_before_delete`  
BEFORE DELETE ON `db`.`table`  
FOR EACH ROW  
INSERT INTO db_bkp.`table` 
    (col1, col2, col3) 
VALUES 
    (OLD.col1, OLD.col2, OLD.col3) 

ich ohne Typ man sie diesesWie alle Spalten in der Tabelle mit SQL-Trigger zur Liste

(col1, col2, col3) 

erhalten möchten von einem

+1

Warum möchten Sie das tun? Erklären Sie sie einfach, sonst erhalten Sie alle Arten oder Fehler mit nicht übereinstimmenden Daten. –

+1

Soweit ich weiß, können Sie eine Einfügung in eine andere Datenbank nicht auslösen, ohne sie in der CREATE-Anweisung zu verbinden. Im folgenden Link wird beschrieben, wie Datenbanken auf verschiedenen Servern verbunden werden. Es kann auch für einen einzelnen Server funktionieren: http://stackoverflow.com/questions/26503342/how-to-create-trigger-to-insert-data-to-a-database-on-another-server – Otterbein

+0

Rich Benner cuz Ich muss 800 + Trigger machen, ich kann sie nicht 1 zu 1 machen –

Antwort

1

Es ist möglich, die Liste der Spalten eines bestimmten abfragen Tabelle von information_schema.columns Tabelle in MySQL.

In diesem Fall müssen Sie jedoch Ihre Insert-Anweisung mit prepared statement erstellen, da Sie damit den Befehl sql als Zeichenfolge erstellen und dann ausführen können.

... 
declare s_fields, s_sql varchar(1000); --length should depend on how many fields you have 
select group_concat(column_name) into s_fields 
    from information_schema.columns 
    where table_name='yourtable' 
    group by table_name 
    limit 1; 
set s_sql=concat('insert into tablename (',s_fields, ') values (', variable_holding_comma_separated_list_of_values,')'); 
prepare stmt from s_sql; 
execute stmt; 
deallocate prepare stmt; 
... 
1

Ich habe den Code von @Shadow geändert. Sie müssen auch den Schemanamen einschließen. und setzen Sie es auch in backquotes, um Leerzeichen in den Feldnamen zu vermeiden.

... 
DECLARE s_sql VARCHAR(1000); --length should depend ON how many fields you have 

SELECT 
    CONCAT(
    'insert into tablename (' 
    ,GROUP_CONCAT(CONCAT('`',COLUMN_NAME,'`')) 
    ,') values (' 
    ,GROUP_CONCAT(CONCAT('`OLD`.`',COLUMN_NAME,'`')), 
    ')' 
) 
    INTO s_sql 
FROM information_schema.columns 
WHERE 
    TABLE_NAME='your_table' 
AND 
    TABLE_SCHEMA='your_schema' 
GROUP BY TABLE_NAME; 


prepare stmt from s_sql; 
execute stmt; 
deallocate prepare stmt; 
... 

Probe

MariaDB [your_schema]> SELECT 
    -> CONCAT(
    ->  'insert into tablename (' 
    ->  ,GROUP_CONCAT(CONCAT('`',COLUMN_NAME,'`')) 
    ->  ,') values (' 
    ->  ,GROUP_CONCAT(CONCAT('`OLD`.`',COLUMN_NAME,'`')), 
    ->  ')' 
    -> ) 
    -> INTO @s_sql 
    -> FROM information_schema.columns 
    -> WHERE 
    -> TABLE_NAME='your_table' 
    -> AND 
    -> TABLE_SCHEMA='your_schema' 
    -> GROUP BY TABLE_NAME; 
Query OK, 1 row affected (0.00 sec) 

MariaDB [your_schema]> select @s_sql; 
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 
| @s_sql                                                      | 
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 
| insert into tablename (`sr_no`,`scholar_no`,`paid_amount`,`due_amount`,`fee_date`,`section_id_fk`) values (`OLD`.`sr_no`,`OLD`.`scholar_no`,`OLD`.`paid_amount`,`OLD`.`due_amount`,`OLD`.`fee_date`,`OLD`.`section_id_fk`) | 
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 
1 row in set (0.00 sec) 

MariaDB [your_schema]> 
1

Wenn Sie absolut sicher sind, dass die Tabellen mit den gleichen Feldern sind, können Sie einfach verwenden, dass

CREATE TRIGGER `table_triger_on_before_delete`  
BEFORE DELETE ON `db`.`table`  
FOR EACH ROW  
INSERT INTO db_bkp.`table` 
    SELECT * FROM `db`.`table` WHERE `you_primary_key`= OLD.`you_primary_key` 

Becouse Sie Zeile nicht gelöscht noch :)

Verwandte Themen