Tham chiếu ngữ cảnh quyền hạn của tác nhân SQL


13

Ở công việc mới của tôi, chúng tôi có nhiều phiên bản được đặt tên trên mỗi máy chủ. ví dụ

  • Máy chủ1 \ Dev
  • Máy chủ1 \ DevIntegrated
  • Máy chủ1 \ QA

Tôi có một tập lệnh SQL PowerShell trong các tác phẩm gọi ra HĐH, gọi Foo.exenhưng cần truyền tham số dòng lệnh (chuỗi kết nối). Một công việc Tác nhân SQL sẽ tồn tại trên mỗi phiên bản, với một bước loại PowerShell, cần biết bối cảnh hiện tại là gì. tức là việc thực hiện này bắt đầu trên DevIntegrated.

Tôi không muốn có mọi kịch bản bắt đầu bằng ...

$thisInstance = "Dev"

... đặc biệt là vì tôi phải chỉnh sửa điều đó khi chúng tôi di chuyển sang môi trường (máy chủ mới và phiên bản được đặt tên) trong những tháng tới.

Nếu tôi khởi động SQLPS, tôi có thể xác định phiên bản của mình bằng cách cắt và cắt các kết quả của Vị trí lấy hoặc chạy

(Invoke-Sqlcmd -Query "SELECT @@servername AS ServerName" -SuppressProviderContextWarning).ServerName

Khi Tác nhân SQL bắt đầu công việc loại PowerShell, nó sẽ bắt đầu trong C: \ windows \ system32 và Get-Locationtuyến không hoạt động vì nó không nằm trong ngữ cảnh SQLSERVER. Tôi có thể thay đổi vào bối cảnh đó nhưng tôi sẽ ở "gốc" của SQL Server và sẽ không biết tôi nên sử dụng trường hợp nào. Sử dụng Invoke-Sqlcmdtuyến sẽ không hoạt động vì lý do tương tự (về mặt kỹ thuật, nó xuất hiện ở đó không có ví dụ mặc định)

Theo hiểu biết tốt nhất của tôi, tôi đã liệt kê tất cả các "điều" cơ bản mà tôi có thể vào nhật ký công việc nhưng dường như không có gì hiển thị SQLSERVER:\SQL\Server1\DevIntegrated

Get-Processcó vẻ như tôi có thể sử dụng điều đó và một số voodoo cố gắng kết hợp mọi thứ lại với nhau bằng cách đánh các trường hợp và các spids phù hợp nhưng điều đó nghe có vẻ như là một cuộc tấn công đẫm máu từ địa ngục. Phải có một cái gì đó cơ bản mà tôi đang thiếu, bất cứ ai cũng có thể làm sáng tỏ?

Các lựa chọn thay thế cho PowerShell đã điều tra

Tôi đã điều tra bằng cách sử dụng các loại công việc khác và không có được một giải pháp thỏa đáng. Nghiên cứu chỉ ra PowerShell được liệt kê trong SQL Agent là SQLPS và bắt đầu một thể hiện của nó bằng cách nhấp chuột phải vào Tác nhân tự động thả tôi vào đúng vị trí. Chỉ đến khi tôi dán mã tương tác của mình vào bước công việc thì tôi mới biết về sự khác biệt như đã đề cập trước đó.

Loại công việc của HĐH đưa tôi vào trạng thái giống hệt nhau ở chỗ tôi không thể tìm ra cách xác định trường hợp nào đưa tôi vào trình vỏ lệnh. Chắc chắn, tôi có thể sqlcmd và nhận được giá trị của @@servernamenhưng nếu tôi biết kết nối nào để bắt đầu sqlcmd, tôi sẽ không cần phải truy vấn cơ sở dữ liệu;)

TSQL có thể có thể hoạt động nếu chúng tôi kích hoạt xp_cmdshellnhưng tôi không chắc liệu họ có bật nó không --- cơ sở chính phủ và họ có thể thấy khó chịu với các cài đặt không mặc định. Ngay cả khi đó, tôi vẫn bị mắc kẹt với SQL động và mất rất nhiều tính biểu cảm và sức mạnh mà PowerShell cho vay.

Mặc dù hơi vô duyên, tôi nghĩ rằng việc xác định một biến ở bước đầu tiên và chuyển nó sang các bước kế tiếp nhưng nghiên cứu đã đưa ra bài viết này Xử lý nhiều bước công việc (BOL)

Các bước công việc phải được khép kín. Nghĩa là, một công việc không thể vượt qua các giá trị Boolean, dữ liệu hoặc giá trị số giữa các bước công việc. Tuy nhiên, bạn có thể chuyển các giá trị từ một bước công việc Transact-SQL sang bước khác bằng cách sử dụng các bảng cố định hoặc các bảng tạm thời toàn cầu. Bạn có thể chuyển các giá trị từ các bước công việc chạy các chương trình thực thi từ bước này sang bước công việc khác bằng cách sử dụng tệp.

Tôi không thể sử dụng các thủ thuật phổ biến như cài đặt tệp / biến môi trường / sổ đăng ký nổi tiếng Foo.exetìm kiếm vì điều đó sẽ ngăn việc thực thi đồng thời trên các phiên bản.

TL; DR:

Trong bước Công việc Tác nhân SQL thuộc loại PowerShell, làm thế nào bạn có thể xác định phiên bản của Máy chủ SQL đã khởi chạy quy trình?


4
Là powershell một yêu cầu cho những gì bạn đang làm?
johndacostaa

Yêu cầu thực sự sẽ là phải có một "cái gì đó" được sắp xếp lại trong tác nhân SQL có thể khởi chạy một quy trình DOS với một tham số của cá thể gọi. PowerShell có vẻ phù hợp nhất với những gì không hoạt động ở trên. Xin lỗi vì phản ứng chậm trễ, tôi đã ra khỏi trại Hướng đạo.
billinkc

Câu trả lời:


9

Nếu bạn xem trong SQL Server BOL, SQL Server Agent cung cấp một bộ "mã thông báo" mà nó sẽ thay thế vào cả văn bản lệnh của bước công việc và tệp đầu ra (sau này sẽ ngăn nút "xem" GUI hoạt động). Các mã thông báo này dường như hoạt động cho bất kỳ loại bước nào ngoại trừ T-SQL.

https://docs.microsoft.com/en-us/sql/ssms/agent/use-tokens-in-job-steps#sql-server-agent-tokens

Vì vậy, nếu bạn có bước PowerShell SQL 2008, bạn có thể bắt đầu với:

$sqlInstance = "$(ESCAPE_DQUOTE(SRVR))"

Bạn có thể cần phải sử dụng MACH (tên máy) và INST(chỉ tên ví dụ), vì với thể hiện mặc định SRVR == MACH, nhưng với các thể hiện được đặt tên SRVR == MACH\INST.


3

Thật buồn khi tôi không làm được gì nhiều với các tập lệnh PowerShell được gọi bên trong SQL Server. Tôi cũng không ở máy tính mà tôi có thể chơi với nó ngay bây giờ.

Mặc dù vậy, tôi tin rằng thay vì sử dụng bước loại PowerShell mà nếu bạn đã sử dụng CmdExec và chỉ cần gọi tập lệnh của bạn như bạn sẽ làm từ một dòng lệnh "powershell 'MyScript.ps1'" thì bạn có thể chuyển một tham số có phiên bản bạn đang chạy. Giống như "Powershell 'MyScript.ps1' MyInstanceName".

Vì vậy, khi bắt đầu tập lệnh của bạn, bạn có một thiết lập param () để chấp nhận giá trị đó của MyInstanceName:


param(
   [Parameter(Position=0,Mandatory=$True)]
   [string]$InstanceName
)
#so if I wanted to use sqlcmd
sqlcmd -S $InstanceName -Q "SELECT @@VERSION"

Khi bạn bắt đầu nêu một bước cần thiết để biết nó thuộc trường hợp nào để tập lệnh PowerShell có thể gọi Foo.exe đúng cách. Tuy nhiên, sau này bạn đề cập đến việc có thể chuyển giá trị sang các bước khác. Nếu điều này là đúng, bạn có thể muốn xem xét việc tạo gói SSIS nhỏ gọi tập lệnh PowerShell của bạn và làm bất cứ điều gì khác bạn cần. Với SSIS, bạn có thể thiết lập một biến toàn cục mà toàn bộ gói có thể sử dụng.

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.