Je pense que c'est un problème d'autorisations, mais j'ai du mal à le localiser.
J'ai un groupe de CLR sur un serveur (SQL Server 2016) et ils fonctionnent comme ils le devraient. Tous sont marqués UNSAFE et ils font différents types d'E/S de fichiers (lecture, écriture, copie, déplacement, renommage, etc.). Je peux les exécuter via SSMS ou à partir d'un travail avec la même facilité.
Je dois les installer sur un autre serveur (également SQL Server 2016). En utilisant le projet Visual Studio d'origine, je les ai déployés sur le nouveau serveur. Ils apparaissent dans SSMS. Cette partie semble bien.
Lorsque j'essaye d'en exécuter un à partir de SSMS, j'obtiens l'erreur suivante: "L'accès au chemin" quel que soit le chemin que j'ai passé "est refusé."
Je suis connecté à SSMS sous mon identifiant Windows. J'ai des autorisations sur la base de données, je suis dbo. Je suis administrateur sur le serveur. J'ai des autorisations dans le système de fichiers.
Que pouvais-je manquer de plus?
J'ai des autorisations sur la base de données, je suis dbo. Je suis administrateur sur le serveur. J'ai des autorisations dans le système de fichiers.
Rien de tout cela n'a d'importance, généralement. À moins que vous (ou celui qui a codé les méthodes SQLCLR) n'implémentiez l'emprunt d'identité, le contexte de sécurité utilisé pour les opérations externes est celui du compte de service exécutant SQL Server (similaire à xp_cmdshell
comportement). C'est ce compte qui a besoin d'une autorisation d'accès aux chemins d'accès auxquels vous essayez d'accéder.
Par souci d'exhaustivité concernant les autorisations d'accès aux fichiers:
Gardez à l'esprit que les "DENY" ont priorité sur les "GRANT" (tout comme avec les autorisations SQL Server).
Afin de déterminer si le compte utilisé pour l'accès externe a réellement l'autorisation nécessaire pour le (s) dossier (s) et/ou fichier (s):
NT Service\MSSQLSERVER
)Y a-t-il des autorisations DENY n'importe où dans le chemin d'accès auquel vous essayez d'accéder?
AUSSI Si tout le code ne concerne que le système de fichiers, alors vous n'avez probablement pas besoin que l'assembly soit marqué comme UNSAFE
et il devrait plutôt être EXTERNAL_ACCESS
. Pas trop d'opérations de système de fichiers devraient nécessiter UNSAFE
. L'un d'eux obtient une liste de lecteurs fixes, mais ne sait pas quoi d'autre.
Assurez-vous que le compte de service exécutant SQL Server a accès à ces chemins.
Ce sera le compte qui interagit réellement avec les fichiers sur le disque.
Au cas où vous l'auriez fait de toutes les manières mentionnées ci-dessus, mais cela n'a pas fonctionné. D'après mon expérience jusqu'à présent, vous pouvez essayer d'ouvrir SSMS en tant que Administrateur.