Premièrement, vous devez utiliser sys.objects au lieu de dbo.sysobjects. dbo.sysobjects est une construction SQL 2000 qui n'existe que dans SQL 2008 pour des raisons de compatibilité descendante. sys.objects contient une ligne pour chaque objet de portée de schéma défini par l'utilisateur et créé dans une base de données, vous n'avez donc pas du tout à filtrer votre requête. sys.all_objects est un sur-ensemble, qui contient à la fois des objets système et utilisateur.
Deuxièmement - du côté des autorisations - dans SQL Server 2005 et les versions ultérieures, la visibilité des métadonnées dans les vues de catalogue est limitée aux éléments sécurisables qu'un utilisateur possède ou sur lesquels l'utilisateur a obtenu une autorisation. Votre utilisateur devra donc obtenir une autorisation sur les éléments qu'il recherche. Accorder VIEW DEFINITION à l'utilisateur sur le ou les schémas de la base de données permettrait à la requête de fonctionner, sans accorder l'accès à aucune donnée.