Napisałem wyzwalacz w MySQL odpowiadający za walidację po stronie MySQL adresu IP oraz sprawdzanie czy nie został zbanowany
Cel:
sprawdzenie aby dodawany adres IP był walidowany na poziomie bazy danych
- sprawdzenie czy adres IP jest już dodany do bazy danych
- sprawdzenie czy adres IP jest poprawnym adresem IP
Walidacja dla IPv4
Wyzwalacz działał dla MS SQL obecnie przepisuję wszystko do MySQL i nie wiem jakie są różnice
Błąd:
Error Code: 1422. Explicit or implicit commit is not allowed in stored function or trigger.
Kod:
create table `banned_type`
(
`id` int(11) NOT NULL AUTO_INCREMENT,
`value` varchar(128),
PRIMARY KEY (`id`)
);
insert into `banned_type`(`value`)
values ('e-mail');
insert into `banned_type`(`value`)
values ('domain');
insert into `banned_type`(`value`)
values ('keyword');
insert into `banned_type`(`value`)
values ('IPv4_address');
insert into `banned_type`(`value`)
values ('IPv6_address');
create table `banned`
(
`id` int(11) NOT NULL AUTO_INCREMENT,
`value` nvarchar(320) not null,
`type` int not null,
`add_date` datetime not null DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
FOREIGN KEY (`type`) REFERENCES `banned_type`(`id`)
);
insert into `banned`(`value`,`type`)
values('10minut.xyz','2');
insert into `banned`(`value`,`type`)
values('10minut.com.pl','2');
insert into `banned`(`value`,`type`)
values('xoixa.com','2');
insert into `banned`(`value`,`type`)
values('10minutmail.pl','2');
insert into `banned`(`value`,`type`)
values('10mail.org','2');
insert into `banned`(`value`,`type`)
values('10minutemail.net','2');
insert into `banned`(`value`,`type`)
values('10minutemail.com','2');
insert into `banned`(`value`,`type`)
values('dropmail.me','2');
insert into `banned`(`value`,`type`)
values('minuteinbox.com','2');
insert into `banned`(`value`,`type`)
values('20minutemail.com','2');
DELIMITER $$
create trigger `banned_value_validation`
AFTER INSERT on `banned`
FOR EACH ROW
begin
declare IPv4 varchar(15);
if EXISTS(select * from `inserted` where `inserted`.`type`=4)
then
set IPv4=CAST(
(
select `inserted`.`banned_value`
from `inserted`
where `inserted`.`type`=4
)as char(15));
#sprawdzenie czy dany adres już nie jest zbanowany
if EXISTS (
select *
from
`inserted`
where `inserted`.`value` in
(
select `value`
from `banned`
where `banned`.`id` not in
(
select `inserted`.`id`
from `inserted`
)
)
)
then
#select "Invalid IPv4 address (IPv4 was banned)";
ROLLBACK;
end if;
if IPv4 like '%_.%_.%_.%_'
and IPv4 not like '%.%.%.%.%'
and IPv4 not like '%`^0-9.`%'
and IPv4 not like '%`0-9``0-9``0-9``0-9`%'
and IPv4 not like '%`3-9``0-9``0-9`%'
and IPv4 not like '%2`6-9``0-9`%'
and IPv4 not like '%25`6-9`%'
Then
set IPv4 = IPv4;
#select "CORRECT IPv4 address";
else
#select "Invalid IPv4 address (IPv4 format error)";
ROLLBACK;
end if;
end if;
END$$