A opção 1 é sua melhor aposta.
Conceder acesso ao público não é uma boa ideia. Pode ser o caso de um usuário alterar as funções do trabalho e, nesse momento, você não desejaria que a função Pública tivesse acesso aos seus dados. A menos que seja o caso de que TODAS as pessoas da sua organização tenham acesso ao seu aplicativo.
Criar um grupo e atribuí-lo à função datareader não é necessariamente uma boa ideia, pois pode haver dados que você não quer que todos na função leiam (portanto, sua especificação "objetos específicos de banco de dados").
Se você criar um grupo e, em seguida, conceder acesso SELECT / EXECUTE / etc aos objetos em questão, isso deverá ser feito para você.