Especificar conexão na consulta T-SQL do Management Studio

9

Ao adicionar usuários a funções em servidores de banco de dados, geralmente uso a função "Script this action" na GUI. Depois, basta ir em "Connection :: Change Connection" para fazer o mesmo nos meus outros servidores.

Existe uma maneira de especificar a conexão na ação com script para não precisar executar a segunda etapa de Alterar conexão?

Kyle Brandt
fonte

Respostas:

12

Não há como fazer isso como parte de um script do SSMS, mas você tem duas opções.

Uma coisa que você pode fazer é usar o modo SQLCMD e o comando :: connect para ter um script que se conecte a vários servidores e execute o script. Isso funciona bem se você salvar o script para o usuário e usar o comando: r para carregar o script de um arquivo.

Outra coisa que você pode fazer é configurar um servidor de gerenciamento central e, em seguida, executar seu script em vários servidores ao mesmo tempo.

SQLRockstar
fonte
11
"Servidor de Gerenciamento Central". ah, é isso que eu não uso atualmente ...
gbn
Sim, é uma jóia escondida para coisas como essa, muito melhor que os scripts SQLCMD.
SQLRockstar
2

Na verdade, é possível a partir do T-SQL, mas você precisa atender a um determinado conjunto de condições e saltar algumas etapas.

  • Primeiro, você precisa ativar as consultas remotas (OPENDATASOURCE / OPENROWSET) no servidor no qual as consultas serão executadas.
  • Segundo, você precisa garantir que os servidores de destino tenham acesso remoto ativado.
  • Terceiro, você precisará fazer uso intenso de SQL dinâmico para "injetar" o código T-SQL no mecanismo de banco de dados do servidor de destino a ser executado.

Aqui está um exemplo de script que permitirá que você aproveite o CMS para automatizar tarefas 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.
Dave
fonte
1

Não. Somente o banco de dados por USE Database. Uma conexão não é programável.

O SSMS 2008 (?) E outras ferramentas oferecem a capacidade de "executar em vários servidores". Desculpe, eu não uso esse recurso na minha função atual, por isso não tenho esse problema.

gbn
fonte