Database schema for passing requests to role based users
OK - here's my first pass at answering your question. 

If a user has role1 in a given assigment and can have another role in a different assigment, then my schema will have to change. If necessary, this can be looked at. I think that some of your requirements will require more than SQL to fulfill - you will probably have to start looking at triggers.

You haven't mentioned your RDBMS - my schema is for PostgreSQL. For example MySQL doesn't have the capabilities of PostgreSQL, but you can implement many things  triggers and stored procedures. I would strongly recommend PostgreSQL over MySQL if you're going for an Open Source database. Firebird is also a far more capable RDBMS than MySQL. CHECK CONSTRAINTs, REGEXes, CTEs and analytic functions - not implemented (or very poorly so - REGEXes) in MySQL, present in the others.

There are a couple of extra tables in my schema - let me know if this corresponds to your needs. I'm assuming that a request will be broken into assigments - no need to have 4 roles per assignment - the information on who performed each assignment will be in the workflow tables

You could eliminate the workflow table by putting a user_id there and a boolean for completed - maybe simpler? Though having a small assignment table and moving completed assignments to the workflow table might have  favourable performance impact.

DROP TABLE IF EXISTS workflow;
DROP TABLE IF EXISTS assignment;
DROP TABLE IF EXISTS request;
DROP TABLE IF EXISTS my_user;
DROP TABLE IF EXISTS role;


Remove the tables if they exist.

CREATE TABLE role  -- caution, may be a reserved word in some RDBMSs.
(
  role_id SERIAL CONSTRAINT role_pk PRIMARY KEY,
  role_name VARCHAR(10) NOT NULL,
  role_description VARCHAR(100) NOT NULL
);

CREATE TABLE my_user  -- user is a reserved word in PostgreSQL.
(
  user_id SERIAL  CONSTRAINT user_pk PRIMARY KEY NOT NULL, 
  user_name VARCHAR(25) CONSTRAINT user_name_nn NOT NULL,
  user_role INT,                   -- NOT NULL not necessary due to FK constraint 
  CONSTRAINT user_role_fk FOREIGN KEY (user_role)
      REFERENCES role (role_id) ON UPDATE CASCADE
);


CREATE TABLE request
(
  request_id SERIAL CONSTRAINT request_pk PRIMARY KEY, 
  request_name VARCHAR(20) CONSTRAINT rq_name_nn NOT NULL, 
  request_user_id INT CONSTRAINT rq_user_nn NOT NULL,
  CONSTRAINT req_user_fk FOREIGN KEY (request_user_id)
      REFERENCES my_user (user_id) ON UPDATE CASCADE
);


CREATE TABLE assignment
(
  assignment_id SERIAL CONSTRAINT assignment_pk PRIMARY KEY,
  assignment_req_id INT CONSTRAINT assgt_req_id_nn NOT NULL,
  assignment_role INT CONSTRAINT assgt_role_id_nn NOT NULL,
  CONSTRAINT asst_req_fk FOREIGN KEY (assignment_req_id)
      REFERENCES request (request_id) ON UPDATE CASCADE 
);


CREATE TABLE workflow
(
  workflow_id SERIAL CONSTRAINT workflow_id PRIMARY KEY,
  workflow_req_id INT CONSTRAINT wkflw_req_id_nn NOT NULL,
  workflow_user_id INT CONSTRAINT wkflw_user_id_nn NOT NULL,
  CONSTRAINT wkflw_req_fk FOREIGN KEY (workflow_req_id)
     REFERENCES request (request_id) ON UPDATE CASCADE,
  CONSTRAINT wkflw_user_fk FOREIGN KEY (workflow_user_id)
     REFERENCES my_user (user_id) ON UPDATE CASCADE
);