55 行
1.2 KiB
PL/PgSQL
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();
|