web-dev-qa-db-fra.com

Comment modifier ou mettre à jour la connexion au serveur local dans le travail du plan de maintenance

Deux jours en arrière, notre client a changé l'un de nos noms de serveur de développement

Après le changement de nom du serveur, tous mes travaux de maintenance et autres travaux échouent en raison d'une incompatibilité de nom de serveur.

Nous utilisons SQL Server 2012 version et Server 2008 OS

Donc, aujourd'hui matin, j'ai renommé mon nom de serveur SQL 2012 en un prénom mis à jour et une table, mises à jour des procédures

J'ai essayé de mettre à jour la connexion au serveur local dans la tâche de maintenance, mais elle n'est pas modifiable. Ensuite, j'ai ajouté une nouvelle connexion au serveur, toujours inutile, j'obtiens une erreur inférieure lors de l'exécution des travaux.

Après avoir essayé avec la page cible dans l'option de propriété des travaux, seul le serveur cible est également sélectionné et le serveur cible multiple est désactivé.

Erreur ci-dessous

Exécuté en tant qu'utilisateur: NT Service\SQLSERVERAGENT. Microsoft (R) SQL Server Execute Package Utility version 11.0.2100.60 pour 64 bits Copyright (C) Microsoft Corporation. Tous les droits sont réservés.
Démarré: 12:01:28 AM Erreur: 2013-12-16 00: 01: 43.98 Code: 0xC00291EC Source: {410F7661-F71A-4B68-9584-BA422AB00F02} Exécuter la tâche SQL
Description: Échec de l'acquisition de la connexion "Connexion au serveur local". La connexion n'est peut-être pas configurée correctement ou vous ne disposez peut-être pas des autorisations appropriées sur cette connexion. Erreur de fin
Erreur: 2013-12-16 00: 02: 00.00
Code: 0xC0024104
Source: Territory_Update
Description: la méthode Execute de la tâche a renvoyé le code d'erreur 0x80131904 (Une erreur liée au réseau ou spécifique à l'instance s'est produite lors de l'établissement d'une connexion à SQL Server. Le serveur n'a pas été trouvé ou n'était pas accessible. Vérifiez que l'instance le nom est correct et que SQL Server est configuré pour autoriser les connexions à distance (fournisseur: fournisseur de canaux nommés, erreur: 40 - Impossible d'ouvrir une connexion à SQL Server)). La méthode Execute doit réussir et indiquer le résultat à l'aide d'un paramètre "out". Erreur de fin
Erreur: 2013-12-16 00: 02: 15.00
Code: 0xC0024104
Source: {4E2AF328-0B8D-4905-83BE-839FDDEFC09C}
Description: la méthode Execute de la tâche a renvoyé le code d'erreur 0x80131904 (Une erreur liée au réseau ou spécifique à l'instance s'est produite lors de l'établissement d'une connexion à SQL Server. Le serveur n'a pas été trouvé ou n'était pas accessible. Vérifiez que l'instance le nom est correct et que SQL Server est configuré pour autoriser les connexions à distance (fournisseur: fournisseur de canaux nommés, erreur: 40 - Impossible d'ouvrir une connexion à SQL Server)). La méthode Execute doit réussir et indiquer le résultat à l'aide d'un paramètre "out".
Erreur de fin DTExec: l'exécution du package a renvoyé DTSER_FAILURE (1).
Commencé: 12:01:28 AM
Terminé: 12:02:15 AM
Écoulé: 46,641 secondes.
L'exécution du package a échoué.
L'étape a échoué.

Aidez-moi dans ce gars, merci d'avance

15
sairam

Les plans de maintenance utilisent des packages SSIS stockés dans MSDB. Ces packages utilisent des chaînes de connexion, qui ne sont pas modifiées après un changement de nom de serveur.

Utilisez le script (reproduit ci-dessous) publié par NancySon dans les commentaires de Comment: renommer un ordinateur qui héberge une instance autonome de SQL Server pour vous inspirer sur la façon dont pour modifier ces chaînes de connexion. Ou recréez les plans de maintenance.

Les plans de maintenance ne voient pas leurs connexions modifiées avec le nouveau nom de serveur et peuvent donc se rompre. Après un changement de nom, vous pouvez constater que vous ne pouvez pas supprimer ou renommer les plans de maintenance existants, alors supprimez-les avant de renommer le serveur et recréez-les ensuite ou exécutez le script suivant pour les corriger:

   use msdb

   DECLARE @oldservername as varchar(max)
    SET @oldservername='<server name>\<instance name>'

   -- set the new server name to the current server name

   declare @newservername as varchar(max)
    set @newservername=@@servername

   declare @xml as varchar(max)
    declare @packagedata as varbinary(max)
    -- get all the plans that have the old server name in their connection string
    DECLARE PlansToFix Cursor
    FOR
    SELECT    id
    FROM         sysssispackages
    WHERE     (CAST(CAST(packagedata AS varbinary(MAX)) AS varchar(MAX)) LIKE '%server=''' + @oldservername + '%')

   OPEN PlansToFix


   declare @planid uniqueidentifier
    fetch next from PlansToFix into @planid

   while (@@fetch_status<>-1)  -- for each plan

   begin
    if (@@fetch_status<>-2)
    begin
    select @xml=cast(cast(packagedata as varbinary(max)) as varchar(max)) from sysssispackages where id= @planid  -- get the plan's xml converted to an xml string

   declare @planname varchar(max)
    select @planname=[name] from  sysssispackages where id= @planid  -- get the plan name
    print 'Changing ' + @planname + ' server from ' + @oldservername + ' to ' + @newservername  -- print out what change is happening

   set @xml=replace(@xml,'server=''' + @oldservername + '''','server=''' + @newservername +'''')  -- replace the old server name with the new server name in the connection string
    select @packagedata=cast(@xml as varbinary(max))  -- convert the xml back to binary
    UPDATE    sysssispackages SET packagedata = @packagedata WHERE (id= @planid)  -- update the plan

   end
    fetch next from PlansToFix into @planid  -- get the next plan

   end

   close PlansToFix
    deallocate PlansToFix
  ----- This will also handle the packages that have a tag such as 
    ----- <DTS:Property DTS:Name="ConnectionString">Data Source=servername;Integrated Security=SSPI;Connect Timeout=30;</DTS:Property>



   DECLARE @oldservername as varchar(max)
    SET @oldservername='<server name>\<instance name>'-- set the new server name to the current server name
    declare @newservername as varchar(max)
    set @newservername = @@servername
    declare @xml as varchar(max)
    declare @packagedata as varbinary(max)-- get all the plans that have the old server name in their connection string
    DECLARE PlansToFix Cursor FOR 
    SELECT id
    FROM sysssispackages
    WHERE (CAST(CAST(packagedata AS varbinary(MAX)) AS varchar(MAX)) LIKE '%Data Source=' + @oldservername + '%')

   OPEN PlansToFix
    declare @planid uniqueidentifier
    fetch next from PlansToFix into @planid 
    while (@@fetch_status<>-1) -- for each plan 
    begin
    if (@@fetch_status<>-2)
    begin
    select @xml=cast(cast(packagedata as varbinary(max)) as varchar(max)) 
    from sysssispackages where id= @planid -- get the plan's xml converted to an xml string
    declare @planname varchar(max)select @planname=[name] from sysssispackages where id= @planid -- get the plan name
    print 'Changing ' + @planname + ' server from ' + @oldservername + ' to ' + @newservername -- print out what change is happening
    set @xml=replace(@xml,'Data Source=' + @oldservername,'Data Source=' + @newservername) -- replace the old server name with the new server name in the connection string
    select @packagedata=cast(@xml as varbinary(max)) -- convert the xml back to binary
    UPDATE sysssispackages SET packagedata = @packagedata WHERE (id= @planid) -- update the plan
    end
    fetch next from PlansToFix into @planid -- get the next plan
    end
    close PlansToFix
    deallocate PlansToFix
14
Edward Dortland

J'ai utilisé ce code de cette réponse à la question de défaillance du serveur renommé SQL Server, mais les plans de maintenance ont toujours leur ancien nom :

SELECT  x.*,
        LocalServerConnectionString = cm.value('declare namespace DTS="www.Microsoft.com/SqlServer/Dts";DTS:ObjectData[1]/DTS:ConnectionManager[1]/@DTS:ConnectionString', 'varchar(1000)')
FROM (
    SELECT  id, name, packageXML = CAST(CAST(packagedata AS VARBINARY(MAX)) AS XML)
    FROM dbo.sysssispackages
    WHERE id IN (SELECT id FROM dbo.sysmaintplan_plans)
) x
CROSS APPLY packageXML.nodes('declare namespace DTS="www.Microsoft.com/SqlServer/Dts";/DTS:Executable/DTS:ConnectionManagers/DTS:ConnectionManager[@DTS:ObjectName="Local server connection"]') p(cm)

Et pour renommer:

UPDATE dbo.sysssispackages SET packagedata = CAST(CAST(REPLACE(CAST(CAST(packagedata AS VARBINARY(MAX)) AS VARCHAR(MAX)), 'OldServerName', 'NewServerName') AS XML) AS VARBINARY(MAX))
WHERE id = 'package GUID'
4
AhsenB

Lorsque vous renommez un serveur SQL (c'est-à-dire changez le nom Windows NetBIOS), vous devez également effectuer cette petite étape manuelle dans SQL Server pour le renommer en interne. Détails dans cet article MSKB .

1
Thomas Pullen

Je sais que c'est un vieux fil/question mais j'ai eu un problème similaire aujourd'hui et je l'ai résolu en appliquant les scripts ci-dessus, alors merci @AhsenB. Et dans le processus, j'ai trouvé une autre façon de résoudre ce problème: modifiez l'étape du travail, sous Sources de données, cochez Connexion au serveur local et modifiez la partie Source de données = Nom du serveur. Et le tour est joué!

1
JohnnyP