In SQL Server 2000 there is a concept called ownership chaining. If the stored procedure and the object it refers to (such as a table or view) are both owned by the same user, security is only checked on the stored procedure. As long as the incoming user has execute rights on the stored procedure, that's all that is needed.
The exception is if the stored procedure uses dynamic SQL such as through EXEC(UTE) or sp_executesql. This causes the SQL to execute in a different batch and in that case the permissions are rechecked.
So if you've got the objects all owned by the same user, then you should only need to grant EXECUTE rights on the stored procedures, as far as SQL Server is concerned. You shouldn't need db_datawriter role membership.
K. Brian Kelley