I had to do similar -- I wanted to hide the "Close Order" button on a Sales Order transaction. One of the easiest ways to accomplish that was to hide the button from the form using a Workflow.
My Workflow was set to on View or Update Events, Triggered Before Record Load, with a Condition to filter which role should or should not have the "Close Order" button. Then on the State, add a "Remove Button" action.
This is not to say it can't be done at the Role level, but offered as an alternative in case it's helpful.