SQL 服务器代理未执行运行第三方 exe 文件的 Python 脚本的一部分

SQL Server Agent not executing part of Python script where it runs a third party exe file

我正在尝试从 SQL 服务器代理中的 powershell 脚本 运行 一个 python 脚本。

我能够执行 python 脚本(Task1-Task2)的大部分工作,除了最后一部分(Task3),其中 运行 是一个名为 的第三方 exe 文件SQBConverter(来自 RedGate) 将文件从 SQB 格式转换为 BAK 格式。

当我直接手动运行 powershell script which 运行s python script时,没有问题。

我将“登录为”从默认(“本地系统”)修改为我自己的(JDoh),它在 SQL Server Agent 中执行 powershell,但它只完成工作,除非它将文件从 SQB 格式转换为 BAK 格式 (Task3)。

不换成我自己的(JDoh),连python脚本的any job都执行不了

我认为 powershell 脚本方面没有任何问题,因为当我将“登录为”更改为“本地系统”时它仍然会触发 python 脚本。它不显示错误,但显示为 SQL 服务器代理作业已完成。但是,它根本 运行 python 脚本中的任何任务。

所以,我猜这可能与 SQL 服务器代理无法 trigger/run SQBConverter exe 文件有关。

这是完整的 python 代码 (ConvertToBAK.py),可以为您提供完整的逻辑概念。它会执行所有操作,直到从 SQB 转换为 BAK(任务 3:最后两行)。

import os
from os import path
import datetime
from datetime import timedelta
import glob
import shutil
import re
import time, sys

today = datetime.date.today()
yesterday = today - timedelta(days = 1)
yesterday = str(yesterday)

nonhyphen_yesterday = yesterday.replace('-','')
revised_yesterday = "LOG_us_xxxx_multi_replica_" + nonhyphen_yesterday 

src = "Z:\TestPCC\FTP"
dst = "Z:\TestPCC\Yesterday"
password = "Password"
path = "Z:\TestPCC\FTP"
now = time.time()

### Task1:  To delete old files (5 days or older)
for f in os.listdir(path):
  f = os.path.join(path, f)
  if os.stat(f).st_mtime < now - 5 * 86400:
    if os.path.isfile(f):
      os.remove(os.path.join(path, f))

filelist = glob.glob(os.path.join(dst, "*"))
for f in filelist:
    os.remove(f)

### Task2: To move all files from one folder to other folder location
src_files = os.listdir(src)
src_files1 = [g for g in os.listdir(src) if re.match(revised_yesterday, g)]

for file_name in src_files1:
    full_file_name = os.path.join(src, file_name)
    if os.path.isfile(full_file_name):
        shutil.copy(full_file_name, dst)   

### Task3: Convert from SQB format to BAK format (running SQBConverter.exe)     
for f in glob.glob(r'Z:\TestPCC\Yesterday\*.SQB'):  
    os.system( f'SQBConverter "{f}" "{f[:-4]}.bak" {password}' )

这是powershell代码(测试。ps1):

$path = 'Z:\TestPCC'
$file = 'ConvertToBAK.py'

$cmd = $path+"\"+$file  # This line of code will create the concatenate the path and file
Start-Process $cmd  # This line will execute the cmd 

这是 SQL 服务器代理步骤的屏幕截图:

我查看了 SQBConverter exe 文件本身的属性,并授予列出的所有用户的完全控制权。

我通过修改 Python 代码的最后一行使其工作。

发件人:

os.system( f'SQBConverter "{f}" "{f[:-4]}.bak" {password}' )

至(绝对路径):

os.system( f'Z:\TestPCC\SQBConverter.exe "{f}" "{f[:-4]}.bak" {password}' )