Specificare la connessione nella query T-SQL di Management Studio


9

Quando si aggiungono utenti come ruoli ai server DB, utilizzo spesso la funzione "Script this action" dalla GUI. Vado quindi su "Connessione :: Cambia connessione" per fare lo stesso sugli altri miei server.

Esiste un modo per specificare la connessione nell'azione con script in modo da non dover eseguire il secondo passaggio Cambia connessione?

Risposte:


12

Non c'è modo di farlo come parte di uno script di SSMS, ma hai due opzioni.

Una cosa che puoi fare è usare la modalità SQLCMD e il comando :: connect per avere uno script che si collegherà a più server ed eseguirà lo script. Funziona bene se si salva lo script per l'utente e si utilizza il comando: r per caricare lo script da un file.

Un'altra cosa che puoi fare è configurare un Central Management Server e quindi eseguire lo script su più server contemporaneamente.


1
"Central Management Server". ah, questo è quello che non uso attualmente ...
gbn

sì, è una gemma nascosta per cose come questa, molto meglio degli script SQLCMD.
SQLRockstar

2

In realtà, è possibile all'interno di T-SQL, ma devi soddisfare un certo insieme di condizioni e saltare attraverso alcuni cerchi.

  • Innanzitutto, è necessario abilitare le query remote (OPENDATASOURCE / OPENROWSET) sul server da cui verranno eseguite le query.
  • In secondo luogo, è necessario assicurarsi che i server di destinazione abbiano l'accesso remoto abilitato.
  • In terzo luogo, sarà necessario fare un uso intensivo di SQL dinamico in modo da poter "iniettare" il codice T-SQL nel motore di database del server di destinazione da eseguire.

Ecco uno script di esempio che ti permetterà di sfruttare il CMS per automatizzare le attività SQL.

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

/* 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.

1

No. Solo il database di USE Database. Una connessione non è programmabile tramite script.

SSMS 2008 (?) E altri strumenti offrono la possibilità di "funzionare su più server". Spiacenti, non utilizzo questa funzionalità nel mio ruolo attuale, quindi non ho questo problema.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.