Question

J'essaie de créer un complément SSMS. Une des choses que je veux faire est de créer une nouvelle fenêtre de requête et de la connecter par programme à une instance de serveur (dans le contexte d'une connexion SQL). Je peux très bien créer la nouvelle fenêtre de script de requête, mais je ne trouve pas comment la connecter sans d'abord me connecter manuellement à quelque chose d'autre (comme l'Explorateur d'objets).

En d'autres termes, si je connecte manuellement Obect Explorer à une instance SQL, puis que j'exécute la méthode de mon complément qui crée la fenêtre de requête, je peux le connecter à l'aide de ce code:

ServiceCache.ScriptFactory.CreateNewBlankScript(
     Editors.ScriptType.Sql,
     ServiceCache.ScriptFactory.CurrentlyActiveWndConnectionInfo.UIConnectionInfo,
     null);

Mais je ne veux pas m'appuyer sur CurrentlyActiveWndConnectionInfo.UIConnectionInfo pour la connexion. Je souhaite définir un nom d'utilisateur et un mot de passe de connexion SQL par programmation.

Quelqu'un a-t-il des idées?

EDIT:

J'ai réussi à connecter la fenêtre de requête en définissant le dernier paramètre sur une instance de System.Data.SqlClient.SqlConnection. Toutefois, la connexion utilise le contexte de la dernière connexion connectée au lieu de ce que j'essaie de définir par programme. En d’autres termes, l’utilisateur auquel il se connecte est celui sélectionné dans la boîte de dialogue de connexion que vous obtenez lorsque vous cliquez sur le bouton Nouvelle requête sans qu’un explorateur d’objets ne soit connecté.

EDIT2:

J'écris (ou j'espère écrire) un complément pour envoyer automatiquement une instruction SQL et les résultats de l'exécution à notre système de suivi des cas lorsqu'il est exécuté sur nos serveurs de production. L’une de mes pensées était de supprimer les autorisations d’écriture et d’attribuer des connexions via ce complément, ce qui obligerait également l’utilisateur à saisir un numéro de casse annulant l’instruction si elle n’y figurait pas. Une autre idée que je viens de faire consiste à inspecter le nom du serveur dans ServiceCache.ScriptFactory.CurrentlyActiveWndConnectionInfo.UIConnectionInfo et à le comparer à notre liste de serveurs de production. Si cela correspond et qu'il n'y a pas de cas #, annulez la requête.

Était-ce utile?

La solution

Je n'ai pas trouvé de moyen de le faire, car il semble n'y avoir aucun moyen de se connecter à la fenêtre de dialogue de connexion.

sur quoi travaillez-vous?

EDIT: Si je comprends bien, vous voulez intercepter la requête en cours d’exécution et si elle correspond au serveur de production, annulez-la sinon envoyez le texte et les résultats à une base de données? hmm ... alors que cela serait possible, mais que cela pose un réel problème, et je ne voudrais pas utiliser un complément pour cela. plus un complément peut être désactivé, désinstallé, etc. essayez de le faire avec une configuration de sécurité appropriée sur votre serveur de production.

Autres conseils

Juste au cas où quelqu'un d'autre chercherait un moyen de créer et de connecter une fenêtre de requête par programmation - bref exemple pour SSMS 2012:

UIConnectionInfo u =new UIConnectionInfo();

u.ServerName = "TestPC\\ServerInstance";

u.ServerType = new Guid("8c91a03d-f9b4-46c0-a305-b5dcc79ff907");

u.AuthenticationType = 0;//Use AuthenticationType = 1 for SQL Server Authentication

u.AdvancedOptions.Set("DATABASE", "AdventureWorks2012");

IScriptFactory scriptFactory = ServiceCache.ScriptFactory;

if(scriptFactory != null)
{
  scriptFactory.CreateNewBlankScript(ScriptType.Sql, u, null);
} 

Cet extrait de code ouvre une nouvelle fenêtre de requête connectée au serveur et à la base de données spécifiés avec l'authentification Windows.

Je n'ai pas encore essayé, mais je ne savais pas si vous aviez essayé.

Microsoft.SqlServer.Management.Smo.RegSvrEnum.UIConnectionInfo u = 
    new Microsoft.SqlServer.Management.Smo.RegSvrEnum.UIConnectionInfo();

Devrait vous permettre de créer votre propre connexion. Mais comme je l'ai dit, je ne l'ai pas encore testé. Vous aurez besoin d'une référence à Microsoft.SqlServer.RegSvrEnum.dll .

Faites-moi savoir si cela fonctionne.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top