Określ połączenie w zapytaniu T-SQL Management Studio

9

Podczas dodawania użytkowników są role na serwerach DB, często używam funkcji „Skryptuj tę akcję” z GUI. Następnie przechodzę do „Connection :: Change Connection”, aby zrobić to samo na moich innych serwerach.

Czy istnieje sposób, w jaki mogę określić połączenie w akcji skryptu, aby nie musiałem wykonywać drugiego kroku zmiany połączenia?

Kyle Brandt
źródło

Odpowiedzi:

12

Nie ma sposobu, aby to zrobić jako część skryptu z SSMS, ale masz dwie opcje.

Jedną rzeczą, którą możesz zrobić, to użyć trybu SQLCMD i polecenia :: connect, aby mieć skrypt, który połączy się z wieloma serwerami i uruchomi skrypt. Działa to dobrze, jeśli zapiszesz skrypt dla użytkownika i użyjesz polecenia: r, aby załadować skrypt z pliku.

Inną rzeczą, którą możesz zrobić, to skonfigurować Central Management Server, a następnie uruchomić skrypt na wielu serwerach jednocześnie.

SQLRockstar
źródło
1
„Serwer centralnego zarządzania”. ah, tego obecnie nie używam ...
gbn
tak, to ukryty klejnot dla takich rzeczy, znacznie lepszy niż skrypty SQLCMD.
SQLRockstar
2

W rzeczywistości jest to możliwe z poziomu T-SQL, ale musisz spełnić pewien zestaw warunków i skoczyć przez kilka obręczy.

  • Najpierw musisz włączyć zapytania zdalne (OPENDATASOURCE / OPENROWSET) na serwerze, z którego zapytania będą uruchamiane.
  • Po drugie, musisz upewnić się, że serwery docelowe mają włączony dostęp zdalny.
  • Po trzecie, będziesz musiał intensywnie korzystać z dynamicznego SQL, aby móc „wstrzyknąć” kod T-SQL do silnika bazy danych docelowego serwera, który ma zostać wykonany.

Oto przykładowy skrypt, który pozwoli Ci wykorzystać CMS do automatyzacji zadań 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
źródło
1

Nie. Tylko baza danych wg USE Database. Połączenie nie jest skryptowalne.

SSMS 2008 (?) I inne narzędzia oferują możliwość „uruchamiania na wielu serwerach”. Niestety, nie używam tej funkcji w mojej obecnej roli, więc nie mam tego problemu.

gbn
źródło