Загрузка данных


use db_4991_07_pr;

set @tot=0;
select @tot;

DELIMITER //
CREATE TRIGGER SUB_COUNTS 
BEFORE INSERT ON STUDENTS
FOR EACH ROW
BEGIN
    SET @tot = @tot+ 1;
END;
//
DELIMITER ;

INSERT INTO STUDENTS (name, lastName, team) VALUES ('Ivan', "Petrov", 2);

select @tot;

set @y="";

DELIMITER //
CREATE TRIGGER Work_yy 
BEFORE INSERT ON WORK
FOR EACH ROW
BEGIN
	DECLARE proj_cnt INT;
    DECLARE team_cnt INT;
    SELECT COUNT(*) INTO proj_cnt FROM PROJECT WHERE shifr = PROJECT.shifr;
    SELECT COUNT(*) INTO team_cnt FROM TEAM WHERE id = TEAM.id;
    IF proj_cnt = 0 or team_cnt = 0 THEN
		SET @y = "Ошибка";
	ELSE
		SET @y = "Успешно";
	END IF;
END;
//
DELIMITER ;

INSERT INTO WORK (teamId, projectId, takt, result) VALUES (111, 111, 111,"111");
select @y;
INSERT INTO WORK (teamId, projectId, takt, result) VALUES (1, 101, 1,"Завершено");
select @y;

DELIMITER //
CREATE TRIGGER rabota
BEFORE INSERT ON WORK
FOR EACH ROW
BEGIN
	DECLARE proj_cnt INT;
    DECLARE team_cnt INT;
    SELECT COUNT(*) INTO proj_cnt FROM PROJECT WHERE shifr = PROJECT.shifr;
    SELECT COUNT(*) INTO team_cnt FROM TEAM WHERE id = TEAM.id;
    IF proj_cnt = 0 or team_cnt = 0 THEN
		SIGNAL sqlstate '45000'
        set message_text = 'ERRROR 1337 No cvyaz';
	END IF;
END;
//
DELIMITER ;

INSERT INTO WORK (teamId, projectId, takt, result) VALUES (1, 101, 1,"Завершено");
INSERT INTO WORK (teamId, projectId, takt, result) VALUES (10, 103, 1,"Завершено");

SET FOREIGN_KEY_CHECKS = 0;

DELIMITER //
CREATE TRIGGER rabota_for_student
BEFORE INSERT ON WORK
FOR EACH ROW
BEGIN
    DECLARE team_cnt INT;
    SELECT COUNT(*) INTO team_cnt FROM TEAM WHERE id = TEAM.id;
    IF team_cnt = 0 THEN
		SIGNAL sqlstate '45000'
        set message_text = 'ERRROR 1337 No cvyaz';
	END IF;
END;
//
DELIMITER ;

INSERT INTO STUDENTS (name, lastName, team) VALUES ('Alex', "Popobv", 2);

INSERT INTO STUDENTS (name, lastName, team) VALUES ('Nikita', "Popobv", 1234);

DELIMITER //
CREATE TRIGGER on_update_cascade_1
AFTER UPDATE ON PROJECT
FOR EACH ROW
BEGIN
	if OLD.shifr != NEW.shifr THEN
		UPDATE WORK
        set projectId = NEW.shifr
        WHERE projectId = OLD.shifr;
	END IF;
END;
//
DELIMITER ;

select shifr from PROJECT limit 1;

select id, projectId from WORK WHERE projectId = 101;

UPDATE PROJECT set shifr = 404 WHERE shifr = 101;

select id, projectId from WORK WHERE projectId = 101;

DELIMITER //
CREATE TRIGGER on_update_cascade_222
AFTER UPDATE ON STUDENTS
FOR EACH ROW
BEGIN
	if OLD.id != NEW.id THEN
		UPDATE STUDENTS
        set team = NEW.id
        WHERE team = OLD.id;
	END IF;
END;
//
DELIMITER ;

UPDATE TEAM set id = 22 where id = 11;
select id, name, lastName, team from STUDENTS where id = 22;

DELIMITER //
CREATE TRIGGER on_delete_cascade_111
AFTER DELETE ON WORK
FOR EACH ROW
BEGIN
    DELETE FROM TEAM WHERE id = OLD.teamId;
END;
//
DELIMITER ;

DELETE FROM WORK WHERE teamId = 1;

SELECT * FROM TEAM WHERE id = 1;

INSERT INTO TEAM (team) VALUES ('lost');

ALTER TABLE STUDENTS 
ALTER COLUMN team SET DEFAULT 100;

DELIMITER //
CREATE TRIGGER before_team_delete
BEFORE DELETE ON TEAM
FOR EACH ROW
BEGIN
    UPDATE STUDENTS 
    SET team = DEFAULT(team) 
    WHERE team = OLD.id;
END;
//
DELIMITER ;

ALTER TABLE TEAM ADD COLUMN Km VARCHAR(4);

DELIMITER //
CREATE TRIGGER triger3_61
BEFORE insert ON TEAM
FOR EACH ROW
BEGIN
	if new.team is not null and length(TRIM(new.team)) >= 1 then
		set NEW.Km = concat(
		SUbSTRING(NEW.team, 1, 1),
        SUbSTRING(new.team, -1)
		);
    else
		set new.Km = null;
	end if;
END;
//
DELIMITER ;
DROP TRIGGER triger3_6;
INSERT into TEAM (id, team , lider, mentor) values (11, "qwe", null, null);

select id , team, Km from TEAM where id = 11;
 
DELIMITER //
CREATE TRIGGER triger3_62
BEFORE insert ON userlist
FOR EACH ROW
BEGIN
	if new.pass is null or new.pass = '' then
    set New.pass = "Top_1_pass";
	end if;
END;
//
DELIMITER ;

insert into userlist (login) values ("qwe123");
insert into userlist (login) values ("get342");
select * from userlist;

CREATE TABLE log_project (
    id INT AUTO_INCREMENT PRIMARY KEY,
    dat VARCHAR(20),                 
    time VARCHAR(20),             
    event VARCHAR(50),               
    row_numb INT                  
);

DELIMITER $$
CREATE TRIGGER trg_project_insert
AFTER INSERT ON PROJECT
FOR EACH ROW
BEGIN
    INSERT INTO log_project (dat, time, event, row_numb)
    VALUES (CURDATE(), CURTIME(), 'INSERT', id);
END$$
DELIMITER ;
DROP TRIGGER trg_project_insert;
DELIMITER $$
CREATE TRIGGER trg_project_delete
AFTER DELETE ON PROJECT
FOR EACH ROW
BEGIN
    INSERT INTO log_project (dat, time, event, row_numb)
    VALUES (CURDATE(), CURTIME(), 'DELETE', id);
END$$
DELIMITER ;


DELIMITER $$
CREATE TRIGGER trg_project_update123
AFTER update ON PROJECT
FOR EACH ROW
BEGIN
    INSERT INTO log_project (dat, time, event, row_numb, users)
    VALUES (CURDATE(), CURTIME(), 'update', id, current_user());
END$$
DELIMITER ;

ALTER TABLE log_project ADD COLUMN users VARCHAR(10);

select * from log_project;
ALTER TABLE PROJECT MODIFY topic VARCHAR(255);
INSERT INTO PROJECT (shifr, topic, project,cost) VALUES (505, "science", "top project", 1234);
update PROJECT set topic = "biology sieadasdasnce" where shifr = 505;
update PROJECT set topic = "тываываываыв sience" where shifr = 101;

SET FOREIGN_KEY_CHECKS = 0;



START TRANSACTION;

DELETE FROM WORK WHERE projectId = 102;

DELETE FROM PROJECT WHERE shifr = 102;

ROLLBACK;



START TRANSACTION;

DELETE FROM WORK WHERE projectId = 102;

DELETE FROM PROJECT WHERE shifr = 102;

COMMIT;



ALTER TABLE TEAM ADD COLUMN kol INT DEFAULT 0;



START TRANSACTION;

SET @A = (SELECT COUNT(*) FROM STUDENTS WHERE team = 1);

UPDATE TEAM SET kol = @A WHERE id = 1;

COMMIT;



DELIMITER //

CREATE PROCEDURE checkOK(

    IN Sh VARCHAR(20),

    IN Tm VARCHAR(100),

    IN Nz VARCHAR(50),

    IN dNla DATE,

    IN dOk DATE

)

BEGIN

    DECLARE rez VARCHAR(3) DEFAULT 'OK';

    DECLARE pr INT;

    START TRANSACTION;

    INSERT INTO PROJECT (shifr, topic, project, dateStart, dateFinish) VALUES (Sh, Tm, Nz, dNla, dOk);

    SELECT DATEDIFF(dateFinish, dateStart) INTO pr FROM PROJECT WHERE shifr = Sh;

    IF pr > 0 THEN

        COMMIT;

    ELSE

        ROLLBACK;

        SET rez = 'No';

    END IF;

    SELECT rez AS Result;

END //

DELIMITER ;



SET @sh = 123, @tm = 'Тестовый проект', @nz = 'Проект_А', @d1 = '2026-01-01', @d2 = '2026-12-31';

CALL checkOK(@sh, @tm, @nz, @d1, @d2);



SET @sh = 122, @tm = 'Ошибка дат', @nz = 'Проект_Б', @d1 = '2025-12-31', @d2 = '2025-01-01';

CALL checkOK(@sh, @tm, @nz, @d1, @d2);



SET GLOBAL event_scheduler = ON;



DELIMITER //

CREATE EVENT delete_old_work

ON SCHEDULE EVERY 1 DAY

DO

BEGIN

    DELETE w FROM WORK w INNER JOIN PROJECT p ON w.project = p.shifr WHERE p.dateFinish < DATE_SUB(CURRENT_DATE, INTERVAL 5 YEAR);

END //

DELIMITER ;



ALTER EVENT delete_old_work ON SCHEDULE EVERY 1 MINUTE;

SHOW EVENTS LIKE 'delete_old_work';



DELIMITER //

CREATE PROCEDURE reduce_cost_yearly()

BEGIN

    UPDATE PROJECT SET cost = cost * 0.99 WHERE dateStart <= DATE_SUB(CURRENT_DATE, INTERVAL 1 YEAR);

END //



CREATE EVENT yearly_cost_update ON SCHEDULE EVERY 1 YEAR DO CALL reduce_cost_yearly() //

ALTER EVENT yearly_cost_update ON SCHEDULE EVERY 1 MINUTE //

ALTER EVENT yearly_cost_update ON SCHEDULE EVERY 1 YEAR //

DELIMITER ;



SHOW EVENTS LIKE 'yearly_cost_update';

SET SQL_SAFE_UPDATES = 0; -- Отключаем защиту

-- ALTER TABLE PROJECT ADD COLUMN atWork TINYINT(1) DEFAULT 1;
-- UPDATE PROJECT SET atWork = 1 WHERE shifr IS NOT NULL;

DELIMITER //


DROP PROCEDURE IF EXISTS delete_project_safe //
CREATE PROCEDURE delete_project_safe(IN p_shifr VARCHAR(20))
BEGIN
    DECLARE is_active TINYINT;
    START TRANSACTION;
    
    SELECT atWork INTO is_active FROM PROJECT WHERE shifr = p_shifr;
    
    IF is_active = 1 THEN
        ROLLBACK;
        SELECT 'ОШИБКА: Проект является текущим (atWork=1). Удаление отменено.' AS Message;
    ELSE
        DELETE FROM WORK WHERE project = p_shifr;
        DELETE FROM PROJECT WHERE shifr = p_shifr;
        COMMIT;
        SELECT 'Проект успешно удалён.' AS Message;
    END IF;
END //

CREATE TABLE IF NOT EXISTS USERS (
    login VARCHAR(50) PRIMARY KEY,
    pass VARCHAR(255),
    phone_home VARCHAR(20),
    phone_cell VARCHAR(20)
) //

DROP PROCEDURE IF EXISTS insert_user_safe //
CREATE PROCEDURE insert_user_safe(IN p_login VARCHAR(50), IN p_home VARCHAR(20), IN p_cell VARCHAR(20))
BEGIN
    IF p_home IS NULL AND p_cell IS NULL THEN
        SELECT 'ОШИБКА: Необходимо указать домашний или сотовый телефон.' AS Message;
    ELSE
        INSERT INTO USERS (login, phone_home, phone_cell) VALUES (p_login, p_home, p_cell);
        SELECT 'Пользователь успешно добавлен.' AS Message;
    END IF;
END //

DROP PROCEDURE IF EXISTS delete_student_safe //
CREATE PROCEDURE delete_student_safe(IN p_st_id INT)
BEGIN
    DECLARE leader_count INT;
    START TRANSACTION;
    
    SELECT COUNT(*) INTO leader_count FROM TEAM WHERE lider = p_st_id;
    
    IF leader_count > 0 THEN
        ROLLBACK;
        SELECT 'ОШИБКА: Студент является лидером команды. Удаление отменено.' AS Message;
    ELSE
        DELETE FROM STUDENT WHERE id = p_st_id;
        COMMIT;
        SELECT 'Студент успешно удалён.' AS Message;
    END IF;
END //

DELIMITER ;

SET SQL_SAFE_UPDATES = 1;