Depois que você tiver a lógica encapsulada em um procedimento armazenado, as permissões nos objetos subjacentes não serão necessárias. Uma maneira de realizar o que você está procurando é com um gatilho na mesa. Algo como:
create trigger tr_del_tbl on tbl after delete as
begin
if user_name() = 'foobar' and exists (select 1 from deleted)
rollback
end
Eu também usaria uma função para fazer isso em vez de um usuário específico. Dessa forma, se você receber outro usuário mais tarde que precise de tratamento semelhante, não será necessário alterar o gatilho; você acabou de adicioná-los ao papel.