Chỉ định kết nối trong Management Studio T-SQL Query


9

Khi thêm người dùng là vai trò vào máy chủ DB, tôi thường sử dụng chức năng "Script this action" từ GUI. Sau đó tôi chỉ cần vào "Kết nối :: Thay đổi kết nối" để thực hiện tương tự trên các máy chủ khác của mình.

Có cách nào để tôi có thể chỉ định kết nối trong hành động theo kịch bản để tôi không phải thực hiện bước Thay đổi kết nối thứ hai đó không?

Câu trả lời:


12

Không có cách nào để làm điều này như là một phần của tập lệnh từ SSMS, nhưng bạn có hai tùy chọn.

Một điều bạn có thể làm là sử dụng chế độ SQLCMD và lệnh :: connect để có một tập lệnh sẽ kết nối với nhiều máy chủ và chạy tập lệnh. Điều này hoạt động tốt nếu bạn lưu tập lệnh cho người dùng và sử dụng lệnh: r để tải tập lệnh từ một tệp.

Một điều khác bạn có thể làm là cấu hình Máy chủ quản lý trung tâm và sau đó chạy tập lệnh của bạn với nhiều máy chủ cùng một lúc.


1
"Máy chủ quản lý trung tâm". à, đó là những gì tôi không sử dụng hiện tại ...
gbn

vâng, nó là một viên ngọc ẩn cho những thứ như thế này, tốt hơn nhiều so với các tập lệnh SQLCMD.
SQLRockstar

2

Trên thực tế, có thể từ bên trong T-SQL, nhưng bạn phải đáp ứng một tập hợp các điều kiện nhất định và chạy qua một vài vòng.

  • Trước tiên, bạn cần kích hoạt các truy vấn từ xa (OPENDATASOURCE / OPENWAYSET) trên máy chủ mà từ đó các truy vấn sẽ được chạy.
  • Thứ hai, bạn cần đảm bảo rằng các máy chủ mục tiêu đã kích hoạt quyền truy cập từ xa.
  • Thứ ba, bạn sẽ cần sử dụng nhiều SQL động để có thể "tiêm" mã T-SQL vào công cụ cơ sở dữ liệu của máy chủ đích sẽ được thực thi.

Dưới đây là một tập lệnh mẫu sẽ cho phép bạn tận dụng CMS để tự động hóa các tác vụ 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

Không. Chỉ có cơ sở dữ liệu bởi USE Database. Một kết nối không phải là kịch bản.

SSMS 2008 (?) Và các công cụ khác cung cấp khả năng "chạy trên nhiều máy chủ". Xin lỗi, tôi không sử dụng tính năng này trong vai trò hiện tại của mình nên không gặp vấn đề này.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.