我有一个很少使用的 2008 R2 SQL Server,所以我创建了一个计划任务,如果没有人登录(通过 IF() 函数),它调用一个非常基本的存储过程使服务器进入睡眠状态。 ..这是存储过程;
/****** Object: StoredProcedure [dbo].[sp_GoToSleep] Script Date: 07/21/2013 13:53:12 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
ALTER PROCEDURE [dbo].[sp_GoToSleep]
AS
BEGIN
SET NOCOUNT ON;
IF NOT EXISTS
(
SELECT
a.loginame AS LoginName
FROM master.sys.sysprocesses AS a
WHERE
loginame NOT LIKE '%XXXX%'
AND hostname <> ''
GROUP BY
db_name(dbid)
, loginame
, hostname
UNION ALL
SELECT
a.LogonName AS LoginName
FROM XXXXDB.dbo.CurrentUser AS a)
BEGIN
EXEC xp_cmdshell "rundll32.exe powrprof.dll,SetSuspendState 0,1,0"
END
END
我遇到的问题是当用户登录并且数据应该存在时调用 EXEC 语句。没有其他东西可以让 PC 进入睡眠状态(脚本被禁用时保持打开状态)。一切都是从具有足够权限的同一个本地帐户运行的,我通过该帐户下的 RDP 登录并检查我在用户登录时是否获得了预期的结果(目前只有我)。该任务设置为在注销本地帐户时运行,并且似乎是问题开始时...
这里有什么我想念的吗?IF 函数必须启动 EXEC 语句,但我知道应该有数据会阻止它 - 除非 SQL 在帐户注销时以某种方式返回不同的结果?会喜欢这方面的一些建议,因为它让我把头发扯掉了:-)
更新:如果有任何区别,任务调度程序正在通过 sqlcmd 调用 sp - 我认为这方面的工作是有效的,因为毫无疑问 sp 正在启动。