π κ°λ
μ μ₯ νλ‘μμ λ 미리 μμ±λ SQL λ¬Έλ€μ μ§ν©μ λ°μ΄ν°λ² μ΄μ€μ μ μ₯νμ¬ νμν λλ§λ€ νΈμΆνμ¬ μ€νν μ μλ νλ‘κ·Έλ¨μ λλ€. μ΄λ₯Ό ν΅ν΄ λ°λ³΅μ μΈ μμ μ μλννκ³ , μ½λμ μ¬μ¬μ©μ±μ λμ΄λ©°, λ°μ΄ν°λ² μ΄μ€ μμ μ μΌκ΄μ±μ μ μ§ν μ μμ΅λλ€.
π οΈ νΉμ§ λ° μ₯μ
- μ±λ₯ ν₯μ: ν λ² μ»΄νμΌλ ν μ¬μ¬μ©λλ―λ‘ μ€ν μλκ° λΉ λ¦ λλ€.
- 보μμ±: μ¬μ©μμκ² μ§μ ν μ΄λΈ μ κ·Ό κΆνμ μ£Όμ§ μκ³ , μ μ₯ νλ‘μμ λ₯Ό ν΅ν΄μλ§ λ°μ΄ν° μ‘°μμ νμ©ν μ μμ΅λλ€.
- λͺ¨λν: 볡μ‘ν μμ μ λ Όλ¦¬μ μΌλ‘ λΆλ¦¬νμ¬ κ΄λ¦¬ν μ μμ΅λλ€.
- μ½λ μ¬μ¬μ©μ±: 곡ν΅λ μμ μ μ μ₯ νλ‘μμ λ‘ μμ±νμ¬ μ¬λ¬ κ³³μμ νΈμΆν μ μμ΅λλ€.
- μ μ§λ³΄μμ±: λΉμ¦λμ€ λ‘μ§μ λ°μ΄ν°λ² μ΄μ€ λ΄λΆμ μΊ‘μννμ¬ μ ν리μΌμ΄μ μ½λμ λΆλ¦¬ν μ μμ΅λλ€.
π μ¬μ©λ²
-
μ μ₯ νλ‘μμ μμ±
CREATE PROCEDURE νλ‘μμ λͺ (λ§€κ°λ³μ λͺ©λ‘) BEGIN -- SQL λ¬Έμ₯λ€ END;
-
μ μ₯ νλ‘μμ νΈμΆ
CALL νλ‘μμ λͺ (μΈμ λͺ©λ‘)
π μμ
μλ₯Ό λ€μ΄, νΉμ λΆμμ μ§μλ€μ νκ· κΈμ¬λ₯Ό κ³μ°νλ μ μ₯ νλ‘μμ λ₯Ό μμ±νκ³ νΈμΆν΄λ³΄κ² μ΅λλ€.
-
μ μ₯ νλ‘μμ μμ±
CREATE PROCEDURE GetAverageSalaryByDept(IN dept_id INT, OUT avg_salary DECIMAL(10,2)) BEGIN SELECT AVG(salary) INTO avg_salary FROM employees WHERE department_id = dept_id; END // DELIMITER ;
-
μ μ₯ νλ‘μμ νΈμΆ
CALL GetAverageSalaryByDept(10, @avg_salary); SELECT @avg_salary;
π νΈλ¦¬κ±°(Trigger)
π― κ°λ
νΈλ¦¬κ±°λ νΉμ ν μ΄λΈμμ INSERT, UPDATE, DELETE λ±μ μ΄λ²€νΈκ° λ°μν λ μλμΌλ‘ μ€νλλ νΉλ³ν μ’ λ₯μ μ μ₯ νλ‘μμ μ λλ€. μ΄λ₯Ό ν΅ν΄ λ°μ΄ν° λ¬΄κ²°μ± μ μ§, μλ λ‘κ·Έ κΈ°λ‘, 볡μ‘ν λΉμ¦λμ€ λ‘μ§ κ΅¬ν λ±μ μνν μ μμ΅λλ€.
π οΈ νΉμ§ λ° μ₯μ
- μλ μ€ν: μ¬μ©μ κ°μ μμ΄ μ§μ λ μ΄λ²€νΈ λ°μ μ μλμΌλ‘ μ€νλ©λλ€.
- λ°μ΄ν° λ¬΄κ²°μ± μ μ§: λ°μ΄ν° λ³κ²½ μ μλμΌλ‘ μ μ½ μ‘°κ±΄μ νμΈνκ±°λ 보μ ν μ μμ΅λλ€.
- κ°μ¬ λ° λ‘κΉ : λ°μ΄ν° λ³κ²½ λ΄μμ μλμΌλ‘ κΈ°λ‘νμ¬ μΆμ ν μ μμ΅λλ€.
π μ¬μ©λ²
-
νΈλ¦¬κ±° μμ±
CREATE TRIGGER νΈλ¦¬κ±°λͺ {BEFORE | AFTER} {INSERT | UPDATE | DELETE} ON ν μ΄λΈλͺ FOR EACH ROW BEGIN -- SQL λ¬Έμ₯λ€ END;
π μμ
μλ₯Ό λ€μ΄, μ§μ ν μ΄λΈμμ κΈμ¬κ° λ³κ²½λ λ λ³κ²½ μ΄λ ₯μ κΈ°λ‘νλ νΈλ¦¬κ±°λ₯Ό μμ±ν΄λ³΄κ² μ΅λλ€.
CREATE TRIGGER LogSalaryChange
AFTER UPDATE ON employees
FOR EACH ROW
BEGIN
IF NEW.salary <> OLD.salary THEN
INSERT INTO salary_changes (employee_id, old_salary, new_salary, change_date)
VALUES (OLD.employee_id, OLD.salary, NEW.salary, NOW());
END IF;
END //
DELIMITER ;
β° μ΄λ²€νΈ μ€μΌμ€λ¬(Event Scheduler)
π― κ°λ
μ΄λ²€νΈ μ€μΌμ€λ¬λ νΉμ μκ°μ΄λ μ£ΌκΈ°μ λ°λΌ μλμΌλ‘ SQL λ¬Έμ μ€ννλλ‘ μμ½νλ κΈ°λ₯μ λλ€. μ κΈ°μ μΈ λ°μ΄ν° λ°±μ , λ‘κ·Έ μ 리, ν΅κ³ μ λ°μ΄νΈ λ±μ μμ μ μλννλ λ° μ¬μ©λ©λλ€.
π οΈ νΉμ§ λ° μ₯μ
- μλν: λ°λ³΅μ μΈ μμ μ μλμΌλ‘ μννμ¬ κ΄λ¦¬ λΆλ΄μ μ€μ λλ€.
- μ μ°μ±: λ€μν μ£ΌκΈ°μ 쑰건μΌλ‘ μ΄λ²€νΈλ₯Ό μμ λ‘κ² μ€μ ν μ μμ΅λλ€.
- κ΄λ¦¬ ν¨μ¨μ±: κ΄λ¦¬μκ° μλμΌλ‘ μνν΄μΌ νλ μμ μ μ€μ¬μ€λλ€.
- ν¨μ¨μ±: μμ€ν λΉμ¬μ© μκ°λμ μμ μ μμ½νμ¬ μ±λ₯ μν₯μ μ΅μνν μ μμ΅λλ€.
π μ¬μ©λ²
-
μ΄λ²€νΈ μ€μΌμ€λ¬ νμ±ν
SET GLOBAL event_scheduler = ON;
-
μ΄λ²€νΈ μμ±
CREATE EVENT μ΄λ²€νΈλͺ ON SCHEDULE μΌμ DO -- SQL λ¬Έμ₯λ€
π μμ
μλ₯Ό λ€μ΄, λ§€μΌ μμ μ νΉμ ν μ΄λΈμ λ°μ΄ν°λ₯Ό λ°±μ νλ μ΄λ²€νΈλ₯Ό μμ±ν΄λ³΄κ² μ΅λλ€.
CREATE EVENT DailyBackup
ON SCHEDULE EVERY 1 DAY
STARTS '2025-03-17 00:00:00'
DO
INSERT INTO employees_backup
SELECT * FROM employees;
π λμ SQL(Dynamic SQL)
λμ SQLμ νλ‘κ·Έλ¨ μ€ν μμ μ SQL λ¬Έμ λμ μΌλ‘ μμ±νκ³ μ€ννλ λ°©λ²μ λλ€. μ΄λ₯Ό ν΅ν΄ λ€μν 쑰건과 μ λ ₯κ°μ λ°λΌ μ μ°νκ² SQL λ¬Έμ ꡬμ±νκ³ μ€νν μ μμ΅λλ€.
μ£Όμ νΉμ§:
- μ μ°μ±: κ³ μ λ SQL λ¬Έμ΄ μλ, μ€ν μμ μ 쑰건μ λ°λΌ SQL λ¬Έμ λμ μΌλ‘ μμ±ν μ μμ΅λλ€.
- 볡μ‘ν 쿼리 μ²λ¦¬: λμ μΌλ‘ μμ±λ SQL λ¬Έμ ν΅ν΄ 볡μ‘ν λΉμ¦λμ€ λ‘μ§μ ꡬνν μ μμ΅λλ€.
- 보μ κ³ λ € νμ: μ¬μ©μ μ λ ₯μ μ§μ ν¬ν¨νλ κ²½μ° SQL μΈμ μ 곡격μ μ·¨μ½ν μ μμΌλ―λ‘, μ λ ₯κ° κ²μ¦μ΄ μ€μν©λλ€.
μ¬μ© μμ:
SET @table_name = 'Employees';
SET @sql = CONCAT('SELECT * FROM ', @table_name);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
μ μμμμλ ν μ΄λΈ μ΄λ¦μ λμ μΌλ‘ μ€μ νμ¬ ν΄λΉ ν μ΄λΈμ λͺ¨λ λ°μ΄ν°λ₯Ό μ‘°νν©λλ€.
μ°Έκ³ : λμ SQLμ μ¬μ©ν λλ SQL μΈμ μ