আসলে, এটি টি-এসকিউএল এর মধ্যে থেকেই সম্ভব, তবে আপনাকে কিছু নির্দিষ্ট শর্ত পূরণ করতে হবে এবং কয়েকটি হুপের মধ্য দিয়ে ঝাঁপিয়ে পড়তে হবে।
- প্রথমত, আপনাকে যে সার্ভার থেকে কোয়েরিগুলি চালানো হবে সেটিতে দূরবর্তী ক্যোয়ারীগুলি (ওপেন্ডাটিএসএসসিআর / ওপেনরোউএসইটি) সক্ষম করতে হবে।
- দ্বিতীয়ত, আপনার লক্ষ্য সার্ভারগুলির দূরবর্তী অ্যাক্সেস সক্ষম হয়েছে তা নিশ্চিত করা দরকার।
- তৃতীয়ত, আপনাকে গতিশীল এসকিউএল এর ভারী ব্যবহার করতে হবে যাতে আপনি টার্গেট সার্ভারের ডাটাবেস ইঞ্জিনে কার্যকর করতে টি-এসকিউএল কোডটি "ইনজেক্ট" করতে পারেন।
এখানে একটি নমুনা স্ক্রিপ্ট যা আপনাকে এসকিউএল টাস্কগুলিকে স্বয়ংক্রিয় করতে সিএমএস লাভ করার অনুমতি দেবে।
/**********************************************************************/
/* 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.