非常に散発的に使用される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が開始されていることに疑いがないため、この側面が機能していると思います。