ระบุการเชื่อมต่อใน Query Studio T-SQL Query


9

เมื่อเพิ่มผู้ใช้เป็นบทบาทในเซิร์ฟเวอร์ฐานข้อมูลฉันมักจะใช้ฟังก์ชั่น "Script this action" จาก GUI จากนั้นฉันก็ไปที่ "การเชื่อมต่อ :: เปลี่ยนการเชื่อมต่อ" เพื่อทำสิ่งเดียวกันบนเซิร์ฟเวอร์อื่นของฉัน

มีวิธีที่ฉันสามารถระบุการเชื่อมต่อในการดำเนินการสคริปต์ดังนั้นฉันไม่จำเป็นต้องทำตามขั้นตอนที่สองเปลี่ยนการเชื่อมต่อ?

คำตอบ:


12

ไม่มีวิธีการทำเช่นนี้เป็นส่วนหนึ่งของสคริปต์จาก SSMS แต่คุณมีสองตัวเลือก

สิ่งหนึ่งที่คุณสามารถทำได้คือใช้โหมด SQLCMD และคำสั่ง :: connect เพื่อให้มีสคริปต์ที่จะเชื่อมต่อกับเซิร์ฟเวอร์หลายเครื่องและเรียกใช้สคริปต์ สิ่งนี้ใช้ได้ดีถ้าคุณบันทึกสคริปต์สำหรับผู้ใช้และใช้คำสั่ง: r เพื่อโหลดสคริปต์จากไฟล์

อีกสิ่งหนึ่งที่คุณสามารถทำได้คือกำหนดค่าเซิร์ฟเวอร์การจัดการส่วนกลางจากนั้นเรียกใช้สคริปต์ของคุณกับเซิร์ฟเวอร์หลายเครื่องพร้อมกัน


1
"เซิร์ฟเวอร์การจัดการจากส่วนกลาง" อานั่นคือสิ่งที่ฉันไม่ได้ใช้ในขณะนี้ ...
gbn

ใช่มันเป็นอัญมณีที่ซ่อนอยู่สำหรับสิ่งนี้ดีกว่าสคริปต์ SQLCMD มาก
SQLRockstar

2

ที่จริงแล้วมันเป็นไปได้จากภายใน T-SQL แต่คุณต้องทำตามเงื่อนไขและ jumpt ผ่านห่วงบางอย่าง

  • ก่อนอื่นคุณต้องเปิดใช้งานแบบสอบถามระยะไกล (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 (?) และเครื่องมืออื่น ๆ นำเสนอความสามารถในการ "ทำงานบนเซิร์ฟเวอร์หลายเครื่อง" ขออภัยฉันไม่ได้ใช้คุณสมบัตินี้ในบทบาทปัจจุบันของฉันดังนั้นจึงไม่มีปัญหานี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.