J'ai une gâchette où je veux envoyer un courrier électronique sur des mises à jour d'une ligne dans une table de vente. Maintenant, l'utilisateur (DBuser) qui exécute le déclencheur a des autorisations très limitées. Donc, je veux que la gâchette soit exécutée en tant que dbmailuser. Un utilisateur qui a des droits d'envoi de courrier électronique. J'ai testé que dbmailuser peut exécuter sp_send_dbmail lors de la connexion à cet utilisateur. Lorsque la gâchette tire cependant, je reçois une erreur ne peut pas exécuter sp_send_dbmail. Donc je me suis connecté comme dbuser , a couru exécuter comme login = 'dbmailuser'; et a été capable d'exécuter sp_send_dbmail. Maintenant, pourquoi je ne peux pas faire cela dans un déclencheur. J'utilise SQL Server 2008. Vous trouverez ci-dessous le déclencheur DDL.
alter TRIGGER SalesClosingTrigger ON SalesClosing WITH EXECUTE AS 'dbmailuser' for insert, update AS BEGIN EXEC msdb.dbo.sp_send_dbmail --@profile_name = 'Test_Email_Profile', @recipients='testemail@test.com', @body = 'This is a test for Database Mail.', @body_format = 'TEXT', @subject = 'Database Mail Test' END GO
3 Réponses :
Ceci est dû à Execute-AS-User Scoping - Contexte La commutation d'un utilisateur de niveau de la base de données se fait par défaut sur cette base de données (et le code ci-dessus s'exécute en dehors de la base de données donnée sur MSDB) et l'authentificateur de base de données n'a pas été invalide. Voir le lien ci-dessus pour plusieurs options sur la façon de résoudre / de contourner. P>
+1 n'est pas tous les jours que je rencontre quelqu'un qui comprend l'exécution comme contexte!
L'exécuté des déclencheurs est identique à celui de Il y a deux alternatives: p>
La taille unique correspond à tous Sledgehammer: L'option de précission chirurgicale: Signature de code. Voir Appeler une procédure dans une autre base de données d'une procédure activée pour un exemple. Ce n'est pas pour les faibles de cœur, cela implique plusieurs étapes complexes: générer un certificat, signer la procédure, déposez la clé privée, copiez le certificat en MSDB, créez un utilisateur dérivé du certificat de MSDB, de subvention à l'authentification de la base de données sur le certificat. Utilisateur dérivé, GRANTE EXÉCUTE SUR SP_SEND_MAIL sur l'utilisateur dérivé du certificat. Toute erreur à l'une de ces étapes rendra la séquence entière inutile, il est très facile de le visser, mais le résultat est une balle absolue à partir d'un point de vue de sécurité. P> li>
ol> en tant qu'utilisateur = '...' code>, pas le même que
exécuter comme login = "..." code>. Chadhoc a déjà souligné le lien vers l'exécution comme contexte d'impersonnation et ses contraintes. Fondamentalement, l'exécution de la clause de la gâchette est garantie par DBO, pas par Sysadmin, elle ne fait confiance qu'à l'intérieur du contexte de la base de données. P>
Alter base de données
Remus, Excelent Informations. Je garderai le code à me connecter. Ce serveur de base de données est pour une application et une seule base de données. Je ne voulais tout simplement pas que l'utilisateur principal ait accès direct au sp_send_mail. Si quelqu'un entre dans la base de données, j'ai beaucoup plus à craindre d'envoyer des courriels. Merci encore cependant!
L'envoi d'un email d'un déclencheur est une mauvaise idée. Vous ne voulez pas être incapable de modifier les données si le serveur de messagerie est en panne. P>
Il est préférable d'envoyer les informations sur l'e-mail à une autre table qui envoie ensuite le courrier électronique d'un travail de course périodique. Celui qui dirige tous les cinq minutes. p>
Il y a aussi quelque chose appelé Service Courtier que je n'ai pas utilisé auparavant que cela puisse aider dans cette tâche, vous voudrez peut-être regarder cela. p>
Dans SQL 2005 et sur SP_SEND_DBMAIL utilise déjà le courtier de service sous les couvertures. Il place la demande de courrier dans une file d'attente dans MSDB et un processus externe le ramasse, post commetter et le délivre au serveur SMTP configuré.
C'est une application héritée, une ASP classique etc. Les règles doivent être pliées / cassées pour les applications qui ne sont pas conformes à une norme pour commencer.