Вкажіть з'єднання в T-SQL Query Management Studio


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.