Geben Sie die Verbindung in der Management Studio T-SQL-Abfrage an

9

Wenn Benutzer zu DB-Servern hinzugefügt werden, verwende ich häufig die Funktion "Diese Aktion ausführen" über die GUI. Ich gehe dann einfach zu "Verbindung :: Verbindung ändern", um dasselbe auf meinen anderen Servern zu tun.

Gibt es eine Möglichkeit, die Verbindung in der Skriptaktion anzugeben, damit ich diesen zweiten Schritt zum Ändern der Verbindung nicht ausführen muss?

Kyle Brandt
quelle

Antworten:

12

Dies ist im Rahmen eines SSMS-Skripts nicht möglich, Sie haben jedoch zwei Möglichkeiten.

Sie können den SQLCMD-Modus und den Befehl :: connect verwenden, um ein Skript zu erhalten, das eine Verbindung zu mehreren Servern herstellt und das Skript ausführt. Dies funktioniert gut, wenn Sie das Skript für den Benutzer speichern und den Befehl: r verwenden, um das Skript aus einer Datei zu laden.

Sie können auch einen zentralen Verwaltungsserver konfigurieren und dann Ihr Skript auf mehreren Servern gleichzeitig ausführen.

SQLRockstar
quelle
1
"Central Management Server". ah, das ist es, was ich derzeit nicht benutze ...
gbn
Ja, es ist ein verstecktes Juwel für solche Dinge, viel besser als SQLCMD-Skripte.
SQLRockstar
2

Eigentlich ist es innerhalb von T-SQL möglich, aber Sie müssen bestimmte Bedingungen erfüllen und durch ein paar Reifen springen.

  • Zunächst müssen Sie Remote-Abfragen (OPENDATASOURCE / OPENROWSET) auf dem Server aktivieren, von dem aus die Abfragen ausgeführt werden.
  • Zweitens müssen Sie sicherstellen, dass auf den Zielservern der Remotezugriff aktiviert ist.
  • Drittens müssen Sie dynamisches SQL intensiv nutzen, damit Sie T-SQL-Code in das Datenbankmodul des auszuführenden Zielservers "einfügen" können.

Hier ist ein Beispielskript, mit dem Sie das CMS zur Automatisierung von SQL-Aufgaben nutzen können.

/**********************************************************************/

/* Global change password script                                      */

/*                                                                    */

/* This script changes the password for a SQL login on all servers    */

/* managed by a Central Management Server. It assumes that the login  */

/* exists on all servers, and that all servers are SQL 2005 or later. */

/**********************************************************************/

DECLARE @nServer NVARCHAR (128) -- Variable to hold the instance name retrieved from the CMS

DECLARE @nSQL NVARCHAR (4000)   -- Variable to hold dynamic SQL

DECLARE @ServerFetch INT        -- Variable to hold the fetch status. In SQL 2005, the @@FETCH_STATUS

                                -- variable is scoped at the system level, so if another process is also

                                -- using a cursor the @@FETCH_STATUS variable will be set according to

                                -- that operation. This allows us to store a persistent value.


DECLARE curServer CURSOR LOCAL STATIC FOR  -- Declare the cursor with the LOCAL and STATIC options, and

                                           -- retrieve the list of server names from the Central Management

                                           -- Server. The value in the [sysmanagement_shared_server_groups_internal]

                                           -- table is user-defined; for purposes of this example we have

                                           -- created a group named "SQL2008".

    SELECT DISTINCT

    s.server_name AS 'ServerName'

    FROM OPENDATASOURCE ('SQLOLEDB', 'Data Source = CMS1\Management; Integrated Security = SSPI').msdb.dbo.sysmanagement_shared_server_groups_internal g

    INNER JOIN OPENDATASOURCE ('SQLOLEDB', 'Data Source = CMS1\Management; Integrated Security = SSPI').msdb.dbo.sysmanagement_shared_registered_servers_internal s ON g.server_group_id = s.server_group_id

    WHERE g.name = 'SQL2008'

    ORDER BY s.server_name

OPEN curServer

FETCH FIRST FROM curServer INTO @nServer       -- Retrieve the first row

SET @ServerFetch = @@FETCH_STATUS              -- Store the status of the fetch operation

WHILE @ServerFetch = 0                         -- If the fetch was successful, we enter the loop. Otherwise

                                               -- execution passes to the statement following the END statement.

    BEGIN

    -- Build the dynamic SQL to alter the password for the SQL login.

    SET @nSQL = 'EXEC OPENDATASOURCE (''SQLOLEDB'', ''Data Source = ' + @nServer

        + '; Integrated Security = SSPI'').master.dbo.sp_executesql N''ALTER LOGIN SQLLogin WITH PASSWORD = ''''<enterStrongPasswordHere>'''''

    -- Execute the dynamic SQL.

    EXEC sp_executesql @nSQL

    FETCH NEXT FROM curServer INTO @nServer    -- Retrieve the next row.

    SET @ServerFetch = @@FETCH_STATUS          -- Store the status of the fetch operation.

    END

CLOSE curServer        -- Close the cursor.

DEALLOCATE curServer   -- Remove the cursor from memory.
Dave
quelle
1

Nein, nur die Datenbank von USE Database. Eine Verbindung ist nicht skriptfähig.

SSMS 2008 (?) Und andere Tools bieten die Möglichkeit, "auf mehreren Servern ausgeführt zu werden". Leider verwende ich diese Funktion in meiner aktuellen Rolle nicht, daher tritt dieses Problem nicht auf.

gbn
quelle