Укажите соединение в Management Studio T-SQL Query


9

При добавлении пользователей ролей на серверы БД я часто использую функцию «Сценарий этого действия» из графического интерфейса. Затем я просто иду в «Connection :: Change Connection», чтобы сделать то же самое на других моих серверах.

Есть ли способ, которым я могу указать соединение в скриптовом действии, чтобы мне не пришлось выполнять этот второй шаг Изменить соединение?

Ответы:


12

Нет способа сделать это как часть скрипта из SSMS, но у вас есть два варианта.

Одна вещь, которую вы можете сделать, это использовать режим SQLCMD и команду :: connect, чтобы иметь скрипт, который будет подключаться к нескольким серверам и запускать скрипт. Это хорошо работает, если вы сохраняете скрипт для пользователя и используете команду: r для загрузки скрипта из файла.

Еще одна вещь, которую вы можете сделать, это настроить центральный сервер управления, а затем запустить скрипт на нескольких серверах одновременно.


1
«Центральный сервер управления». ах, это то, чем я сейчас не пользуюсь ...
gbn

да, это скрытая жемчужина для подобных вещей, намного лучше, чем сценарии SQLCMD.
SQLRockstar

2

На самом деле это возможно изнутри T-SQL, но вы должны выполнить определенный набор условий и перепрыгнуть через несколько обручей.

  • Во-первых, вам необходимо включить удаленные запросы (OPENDATASOURCE / OPENROWSET) на сервере, с которого будут выполняться запросы.
  • Во-вторых, вам нужно убедиться, что на целевых серверах включен удаленный доступ.
  • В-третьих, вам необходимо интенсивно использовать динамический SQL, чтобы вы могли «внедрить» код T-SQL в механизм базы данных целевого сервера, который нужно выполнить.

Вот пример сценария, который позволит вам использовать CMS для автоматизации задач 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

Нет . Только база данных по USE Database. Соединение не поддерживается сценариями.

SSMS 2008 (?) И другие инструменты предлагают возможность «работать на нескольких серверах». Извините, я не использую эту функцию в моей текущей роли, поэтому у меня нет этой проблемы.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.