I have created a code that automatically creates trigger
for MySQL.
But my function still has flaws, one of which is accepting the statements of PK's
and FK's
as if they were table fields.
Look at this statement from a table:
CREATE TABLE 'pedidos' (
'id' INT(11) NOT NULL AUTO_INCREMENT,
'data' DATE NOT NULL DEFAULT '1000-01-01',
'hora' TIME NOT NULL DEFAULT '00:00:00',
'conta_id' INT(11) NOT NULL DEFAULT '0',
'contato_id' INT(11) NOT NULL DEFAULT '0',
'empresa_id' INT(11) NOT NULL DEFAULT '1',
'nome_oportunidade' VARCHAR(300) NOT NULL DEFAULT ' ',
'tipo_oportunidade_id' INT(11) NOT NULL DEFAULT '0',
'subtipo_oportunidade_id' INT(11) NOT NULL DEFAULT '0',
'status_oportunidade_id' INT(11) UNSIGNED NOT NULL DEFAULT '0',
'tarefa_id' INT(11) NOT NULL DEFAULT '0',
'status_entrega_id' INT(11) NOT NULL DEFAULT '0',
PRIMARY KEY ('id'),
INDEX 'Com_Contas' ('conta_id'),
INDEX 'Com_Tipos_Acao' ('tipo_oportunidade_id'),
CONSTRAINT 'fk_oportunidade_tarefa' FOREIGN KEY ('tarefa_id') REFERENCES 'tarefas' ('id'),
CONSTRAINT 'oportunidadeComStatusEntrega' FOREIGN KEY ('status_entrega_id') REFERENCES 'entrega_status' ('id') ON UPDATE CASCADE ON DELETE SET NULL,
)
COLLATE='latin1_swedish_ci'
ENGINE=InnoDB
AUTO_INCREMENT=666666
;
Using a regular expression I search all the fields of the table:
/'(\w*)'/g;
See my code:
<html>
<head>
<script type="text/javascript">
function gerar(){
var conteudo = document.formTabela.conteudo.value;
var reg = /'(\w*)'/g;
var res = conteudo.match(reg);
criarTriggerInsert(res);
}
function criarTriggerInsert(arr){
var tabela = arr.shift();
tabela = tabela.replace(/'/g, '');
var createTrigger = 'CREATE TRIGGER trg_${tabela}_01
AFTER INSERT ON ${tabela}
FOR EACH ROW BEGIN
INSERT INTO historico_tabela (
operacao,
data_acao,
hora_acao,
tabela,
campo_id,
usuario_insercao,
usuario_alteracao,
campo,
valor_anterior,
valor_atual
) VALUES ';
for( campo in arr ){
var campoTabela = arr[campo].replace(/'/g, '');
createTrigger += ' ( 'insert',
CURDATE(),
CURTIME(),
'${tabela}',
NEW.id,
@usuario_historico,
NULL,
'${campoTabela}',
NULL,
NEW.${campoTabela}
),';
}
createTrigger = createTrigger.substring(0,createTrigger.length -1);
console.log(createTrigger);
}
</script>
</head>
<body>
<form name="formTabela" method="post" onsubmit="return false;">
<label>DDL:</label><br>
<textarea name="conteudo" cols="100" rows="5"></textarea><br>
<button onclick="gerar();">Gerar Trigger</button>
<form/>
</body>
</html>
Running based on the DDL
above, I can generate the result more or less expected, see the result of the execution:
CREATE TRIGGER trg_pedidos_01
AFTER INSERT ON pedidos
FOR EACH ROW BEGIN
INSERT INTO historico_tabela (
operacao,
data_acao,
hora_acao,
tabela,
campo_id,
usuario_insercao,
usuario_alteracao,
campo,
valor_anterior,
valor_atual
) VALUES ( 'insert',
CURDATE(),
CURTIME(),
'pedidos',
NEW.id,
@usuario_historico,
NULL,
'id',
NULL,
NEW.id
), ( 'insert',
CURDATE(),
CURTIME(),
'pedidos',
NEW.id,
@usuario_historico,
NULL,
'data',
NULL,
NEW.data
), ( 'insert',
CURDATE(),
CURTIME(),
'pedidos',
NEW.id,
@usuario_historico,
NULL,
'hora',
NULL,
NEW.hora
), ( 'insert',
CURDATE(),
CURTIME(),
'pedidos',
NEW.id,
@usuario_historico,
NULL,
'conta_id',
NULL,
NEW.conta_id
), ( 'insert',
CURDATE(),
CURTIME(),
'pedidos',
NEW.id,
@usuario_historico,
NULL,
'contato_id',
NULL,
NEW.contato_id
), ( 'insert',
CURDATE(),
CURTIME(),
'pedidos',
NEW.id,
@usuario_historico,
NULL,
'empresa_id',
NULL,
NEW.empresa_id
), ( 'insert',
CURDATE(),
CURTIME(),
'pedidos',
NEW.id,
@usuario_historico,
NULL,
'nome_oportunidade',
NULL,
NEW.nome_oportunidade
), ( 'insert',
CURDATE(),
CURTIME(),
'pedidos',
NEW.id,
@usuario_historico,
NULL,
'tipo_oportunidade_id',
NULL,
NEW.tipo_oportunidade_id
), ( 'insert',
CURDATE(),
CURTIME(),
'pedidos',
NEW.id,
@usuario_historico,
NULL,
'subtipo_oportunidade_id',
NULL,
NEW.subtipo_oportunidade_id
), ( 'insert',
CURDATE(),
CURTIME(),
'pedidos',
NEW.id,
@usuario_historico,
NULL,
'status_oportunidade_id',
NULL,
NEW.status_oportunidade_id
), ( 'insert',
CURDATE(),
CURTIME(),
'pedidos',
NEW.id,
@usuario_historico,
NULL,
'tarefa_id',
NULL,
NEW.tarefa_id
), ( 'insert',
CURDATE(),
CURTIME(),
'pedidos',
NEW.id,
@usuario_historico,
NULL,
'status_entrega_id',
NULL,
NEW.status_entrega_id
), ( 'insert',
CURDATE(),
CURTIME(),
'pedidos',
NEW.id,
@usuario_historico,
NULL,
'id',
NULL,
NEW.id
), ( 'insert',
CURDATE(),
CURTIME(),
'pedidos',
NEW.id,
@usuario_historico,
NULL,
'Com_Contas',
NULL,
NEW.Com_Contas
), ( 'insert',
CURDATE(),
CURTIME(),
'pedidos',
NEW.id,
@usuario_historico,
NULL,
'conta_id',
NULL,
NEW.conta_id
), ( 'insert',
CURDATE(),
CURTIME(),
'pedidos',
NEW.id,
@usuario_historico,
NULL,
'Com_Tipos_Acao',
NULL,
NEW.Com_Tipos_Acao
), ( 'insert',
CURDATE(),
CURTIME(),
'pedidos',
NEW.id,
@usuario_historico,
NULL,
'tipo_oportunidade_id',
NULL,
NEW.tipo_oportunidade_id
), ( 'insert',
CURDATE(),
CURTIME(),
'pedidos',
NEW.id,
@usuario_historico,
NULL,
'fk_oportunidade_tarefa',
NULL,
NEW.fk_oportunidade_tarefa
), ( 'insert',
CURDATE(),
CURTIME(),
'pedidos',
NEW.id,
@usuario_historico,
NULL,
'tarefa_id',
NULL,
NEW.tarefa_id
), ( 'insert',
CURDATE(),
CURTIME(),
'pedidos',
NEW.id,
@usuario_historico,
NULL,
'tarefas',
NULL,
NEW.tarefas
), ( 'insert',
CURDATE(),
CURTIME(),
'pedidos',
NEW.id,
@usuario_historico,
NULL,
'id',
NULL,
NEW.id
), ( 'insert',
CURDATE(),
CURTIME(),
'pedidos',
NEW.id,
@usuario_historico,
NULL,
'oportunidadeComStatusEntrega',
NULL,
NEW.oportunidadeComStatusEntrega
), ( 'insert',
CURDATE(),
CURTIME(),
'pedidos',
NEW.id,
@usuario_historico,
NULL,
'status_entrega_id',
NULL,
NEW.status_entrega_id
), ( 'insert',
CURDATE(),
CURTIME(),
'pedidos',
NEW.id,
@usuario_historico,
NULL,
'entrega_status',
NULL,
NEW.entrega_status
), ( 'insert',
CURDATE(),
CURTIME(),
'pedidos',
NEW.id,
@usuario_historico,
NULL,
'id',
NULL,
NEW.id
);
But you see, this trigger is not right. You are repeating the fields:
('id'),
('conta_id')
('tipo_oportunidade_id')
('tarefa_id')
('id')
('status_entrega_id')
And finding the names of Index, Contraint and table name as if it were field:
INDEX 'Com_Contas' ,
INDEX 'Com_Tipos_Acao' ,
CONSTRAINT 'fk_oportunidade_tarefa'
REFERENCES 'tarefas' ('id'),
CONSTRAINT 'oportunidadeComStatusEntrega'
REFERENCES 'entrega_status'
How do I not consider this part of the DDL?
PRIMARY KEY ('id'),
INDEX 'Com_Contas' ('conta_id'),
INDEX 'Com_Tipos_Acao' ('tipo_oportunidade_id'),
CONSTRAINT 'fk_oportunidade_tarefa' FOREIGN KEY ('tarefa_id') REFERENCES 'tarefas' ('id'),
CONSTRAINT 'oportunidadeComStatusEntrega' FOREIGN KEY ('status_entrega_id') REFERENCES 'entrega_status' ('id') ON UPDATE CASCADE ON DELETE SET NULL,
This is happening because my regular expression fetches the FIELDS from the table that are between aspas
, however it is bringing fields that are not actually fields.