文件
hyb-oa/server/prisma/migrations/20260504234500_r83_employee_no_default/migration.sql
T

55 行
1.2 KiB
PL/PgSQL

CREATE SEQUENCE "employee_number_seq"
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
DO $$
DECLARE
v_next_value INTEGER;
BEGIN
SELECT COALESCE(MAX(SUBSTRING(employee_no FROM 4)::INTEGER), 0) + 1
INTO v_next_value
FROM employees
WHERE employee_no ~ '^HYD[0-9]{6}$';
EXECUTE format('ALTER SEQUENCE "employee_number_seq" RESTART WITH %s', v_next_value);
END;
$$;
CREATE OR REPLACE FUNCTION generate_employee_number()
RETURNS TEXT
LANGUAGE plpgsql
AS $$
DECLARE
v_seq INTEGER;
BEGIN
v_seq := nextval('"employee_number_seq"');
IF v_seq > 999999 THEN
RAISE EXCEPTION '员工编号序列已达上限 999999';
END IF;
RETURN 'HYD' || LPAD(v_seq::TEXT, 6, '0');
END;
$$;
ALTER TABLE "employees"
ALTER COLUMN "employee_no" SET DEFAULT generate_employee_number();
CREATE OR REPLACE FUNCTION prevent_employee_no_update()
RETURNS trigger
LANGUAGE plpgsql
AS $$
BEGIN
IF OLD.employee_no IS DISTINCT FROM NEW.employee_no THEN
RAISE EXCEPTION '禁止修改员工编号:employee_no 是不可变字段';
END IF;
RETURN NEW;
END;
$$;
CREATE TRIGGER prevent_employee_no_update_trigger
BEFORE UPDATE ON "employees"
FOR EACH ROW
EXECUTE FUNCTION prevent_employee_no_update();