مدونة منذر اسامة

العودة   منتديات جريت بلينز العربية Great Plains For Arab > منتدى مطوري جريت بلينز > منتدى أكواد ومواضيع الـ SQL Server

الملاحظات

منتدى أكواد ومواضيع الـ SQL Server يتعامل برنامج جريت بلينز مع أقوى قواعد البيانات وهي SQL_Server
سنناقش في هذا المنتدى المواضيع التي تتعلق بخادم قواعد البيانات من مشاكل وحلول وأكواد تضفي طابع الإحترافي لمطوري جريت بلينز

إضافة رد
 
أدوات الموضوع انواع عرض الموضوع
قديم 16-Jul-2013, 12:49 AM   #1
GreatPlains
عضو نشيط
 
تاريخ التسجيل: Sep 2007
المشاركات: 60
إرسال رسالة عبر مراسل MSN إلى GreatPlains
من مواضيعي  
Post سكربت لأغلاق المستخدمين تلقائي

انا كنت بدور في النت علي سكربت لاغلاق idle user فوجدت الأتي :
-------------------------------------------------------------------------------------------------------
كود PHP:
 
CREATE TABLE 
[dbo].[sb_IdleUsersRemoved] (
[
iRowID] [intIDENTITY (11NOT NULL ,
[
iSPID] [intNULL ,
[
vchUserName] [varchar] (50COLLATE
SQL_Latin1_General_CP1_CI_AS NULL 
,
[
dtDateRemoved] [datetimeNULL
ON [PRIMARY]
GO
 
CREATE PROCEDURE sb_RemoveIdleUsers
AS
DECLARE @a
aaaaaaaaaiSPID INT
DECLARE @aaaaaaaaaavchCommand VARCHAR(255)
 

SELECT a.spida.loginame
INTO 
#tempSPIDs
FROM master.dbo.sysprocesses a
INNER JOIN tempdb
.dbo.dex_session b
ON a
.spid b.sqlsvr_spid
WHERE GETDATE
() - a.last_batch .5
UNION
SELECT spid
loginame
FROM master
.dbo.sysprocesses
WHERE dbid IN 
(71617) AND GETDATE() - last_batch .5
 
BEGIN TRANSACTION
 

INSERT INTO sb_custom.dbo.sb_IdleUsersRemoved
SELECT spid
loginameGETDATE()
FROM #tempSPIDs
 

DELETE
FROM tempdb
.dbo.dex_lock
WHERE session_id IN 
(SELECT session_id FROM tempdb.dbo.dex_session WHERE
sqlsvr_spid IN 
(SELECT spid FROM #tempSPIDs))
 

DELETE
FROM tempdb
.dbo.dex_session
WHERE sqlsvr_spid IN 
(SELECT spid FROM #tempSPIDs)
 
COMMIT TRANSACTION
 

SELECT @aaaaaaaaaaiSPID 0
WHILE EXISTS(SELECT FROM #tempSPIDs WHERE spid > @aaaaaaaaaaiSPID)
BEGIN
 
SELECT TOP 1 
@aaaaaaaaaaiSPID spid
FROM 
#tempSPIDs
WHERE spid > @aaaaaaaaaaiSPID
ORDER BY spid
 
SELECT 
@aaaaaaaaaavchCommand 'KILL ' LTRIM(RTRIM(CONVERT(VARCHAR(10),
@a
aaaaaaaaaiSPID)))
EXEC (@aaaaaaaaaavchCommand)
 
END
 
DROP TABLE 
#tempSPIDs
 

DELETE
FROM tempdb
.dbo.dex_lock
WHERE session_id IN 
(SELECT session_id
FROM tempdb
.dbo.dex_session
WHERE sqlsvr_spid NOT IN 
(SELECT spid FROM master.dbo.sysprocesses)
)
 

DELETE
FROM tempdb
.dbo.dex_session
WHERE sqlsvr_spid NOT IN 
(SELECT spid FROM master.dbo.sysprocesses)
 
GO 
-----------------------------------------------------------------------------------
بس المشكلة ان في هدا السكربت معمول كل 12 ساعة بس انا بدي اعدله للكل نصف ساعة بس مش عارف ايش اسوي ارجو ممكن لدية المعرفه انه يدلني
-----------------------------------------------------------------------------------------------
السكربت الثاني منقول ذي ما هو بس انا مش فاهم اي شيء منه اجو ان احد يشرحوا.
--------------------------------------------------------------------------------------
.
SQL Server offers a great way of tracking idle times from a process perspective. This is very cool, because most of the time we want to know that there is absolutely nothing running on the user's session before we decide to take some action -- most of the time remotely.

The following script displays the time (in seconds) the last batch was executed for a particular Dynamics GP user. It looks at the DEX_SESSION table and cross-reference it with the SPIDs retrieved via the undocumented SQL Server system stored procedure sp_who2.

UserActivity.sql


-- Create by Mariano Gomez, MVP
-- This script conferes no rights and has no warranties express or implied
كود PHP:
 
[LEFT]USE MASTER
GO
[/LEFT]
 
[
LEFT]IF OBJECT_ID('tempdb.dbo.#GP_UserActivity'IS NOT NULL
DROP TABLE 
#GP_UserActivity
GO[/LEFT]
 
[
LEFT]CREATE TABLE #GP_UserActivity
SPID int
, [Statusvarchar50)
, [
Loginvarchar80)
HostName varchar80)
BlkBy varchar10)
dbanme varchar80)
Command varchar500)
CpuTime int
DiskIO int
LastBatch varchar22)
ProgramName varchar200)
SPID2 int
RequestID int
)[/LEFT]
 
[
LEFT]INSERT #GP_UserActivity EXEC sp_who2[/LEFT]
 
[LEFT]SELECT
SPID
, [Login]
datediff(sscast(substring(LastBatch15) + '/' castdatepartyeargetdate()) as char4)) +
' ' substringlastbatch720) as datetime), getdate() ) 'seconds'
FROM #GP_UserActivity INNER JOIN tempdb.dbo.DEX_SESSION on spid = sqlsvr_spid[/LEFT] 
The script can be automated to track idleness information periodically and obtain detailed reports of system usage among GP users -- a sort of process activity. I use it a lot to plan server expansions activities and monitoring for my clients in conjunction with other important metrics. I hope you find this script useful in your daily administrative activities.

[Edit] One thing I truly like about blogging is that there is no short of solutions to a problem. My friend Robert Cavill, Systems Analyst in Western Australia offers his own version of determining Dynamics GP users' activity (or lack thereof). Robert adds "I have to point out to you that sometimes I have noticed that on my system the DEX_SESSION table infrequently will not have a row present in it for an active user". His comment is well on as the above script will exclude such users. Why and how a logged on user does not register a session in the DEX_SESSION table is something that's up for research, but the bottom line is it happens, especially on Citrix and Terminal Server environments. Take a look at Robert's elegant script:
كود PHP:
 
 
-- Created by Robert Cavill
-- This script conferes no rights and has no warranties express or implied
 
SELECT
CASE
WHEN S.session_id is null
THEN 
'Missing DEX_SESSION'
WHEN A.USERID <> P.loginame or P.loginame is null
THEN 
'Phantom'
ELSE ''
END MismatchOnUserID,
 
CASE
WHEN datediff miP.last_batchgetdate() ) > 90
THEN 
'Idle ' str datediff miP.last_batchgetdate() ) )
ELSE 
'' 
END AS Working
A.USERID
A.CMPNYNAM
INTERID
LOGINDAT LOGINTIM LoginDatestamp
SQLSESID
P.login_time
P.last_batch
datediff miP.last_batchgetdate() ) SinceLastAction
S.session_id
S.sqlsvr_spid
P.spid
P.status
P.net_address
P.dbid
P.hostname
P.loginame
FROM DYNAMICS
..ACTIVITY A
LEFT JOIN DYNAMICS
..SY01400 U on A.USERID U.USERID
LEFT JOIN DYNAMICS
..SY01500 C on A.CMPNYNAM C.CMPNYNAM
LEFT JOIN tempdb
..DEX_SESSION S on A.SQLSESID S.session_id
LEFT JOIN master
..sysprocesses P on S.sqlsvr_spid P.spid and ecid 0
LEFT JOIN master
..sysdatabases D on P.dbid D.dbid 
-----------------------------------------------------------------------------------------
ولا تنسو ان في تصويت من ميكرسوفت للطرح اغلاق البرنامج كل فتر تلاقي للمستخدمين
http://www.microsoft.com/Businesssol...ic.greatplains

آخر تعديل بواسطة Monzer Osama ، 16-Jul-2009 الساعة 09:51 AM.
GreatPlains غير متواجد حالياً   رد مع اقتباس
قديم 16-Jul-2013, 12:03 PM   #2
GreatPlains
عضو نشيط
 
تاريخ التسجيل: Sep 2007
المشاركات: 60
إرسال رسالة عبر مراسل MSN إلى GreatPlains
من مواضيعي  
افتراضي

انا حليت المشكلة في السكربت الاول وعرفت ان اعدله لكل نصف ساعة
الحل كما يلي
كود PHP:
CREATE PROCEDURE sb_RemoveIdleUsers
AS
DECLARE @a
aiSPID INT
DECLARE @aavchCommand VARCHAR(255)


SELECT a.spida.loginame
INTO 
#tempSPIDs
FROM master.dbo.sysprocesses a
INNER JOIN tempdb
.dbo.dex_session b
ON a
.spid b.sqlsvr_spid
WHERE GETDATE
() - a.last_batch >[COLOR="Red".021[/COLOR]
UNION
SELECT spid
loginame
FROM master
.dbo.sysprocesses
WHERE dbid IN 
(71617) AND GETDATE() - last_batch > [COLOR="Red"].021[/COLOR]

BEGIN TRANSACTION


INSERT INTO sb_custom.dbo.sb_IdleUsersRemoved
SELECT spid
loginameGETDATE()
FROM #tempSPIDs


DELETE
FROM tempdb
.dbo.dex_lock
WHERE session_id IN 
(SELECT session_id FROM tempdb.dbo.dex_session WHERE
sqlsvr_spid IN 
(SELECT spid FROM #tempSPIDs))


DELETE
FROM tempdb
.dbo.dex_session
WHERE sqlsvr_spid IN 
(SELECT spid FROM #tempSPIDs)

COMMIT TRANSACTION


SELECT @aaiSPID 0
WHILE EXISTS(SELECT FROM #tempSPIDs WHERE spid > @aaiSPID)
BEGIN

SELECT TOP 1 
@aaiSPID spid
FROM 
#tempSPIDs
WHERE spid > @aaiSPID
ORDER BY spid

SELECT 
@aavchCommand 'KILL ' LTRIM(RTRIM(CONVERT(VARCHAR(10),
@a
aiSPID)))
EXEC (@aavchCommand)

END

DROP TABLE 
#tempSPIDs


DELETE
FROM tempdb
.dbo.dex_lock
WHERE session_id IN 
(SELECT session_id
FROM tempdb
.dbo.dex_session
WHERE sqlsvr_spid NOT IN 
(SELECT spid FROM master.dbo.sysprocesses)
)


DELETE
FROM tempdb
.dbo.dex_session
WHERE sqlsvr_spid NOT IN 
(SELECT spid FROM master.dbo.sysprocesses)
GO 
المشكلة الثانية ان انا مش عارف كيف اشغل الي السكربت
اربط السكربت بوقت محدد يعني كل خمسه دقائق اشتغل
GreatPlains غير متواجد حالياً   رد مع اقتباس
قديم 17-Jul-2013, 09:01 PM   #3
Monzer Osama
مدير عام منتديات جريت بلينز العربية
افتراضي

اقتباس:
المشاركة الأصلية كتبت بواسطة GreatPlains مشاهدة المشاركة
المشكلة الثانية ان انا مش عارف كيف اشغل الي السكربت
اربط السكربت بوقت محدد يعني كل خمسه دقائق اشتغل
هل افهم من كلامك انك تريد معرفة كيف جدولة تشغيل سكريبت معين من خلال SQL Server?
استخدام الـ Jobs من داخل SQL Server يسهل عليك هذه العملية بحيث يقوم بتشغيل سكريبت معين أن تحده بتشغيله كل يوم عند الساعة الفلانية أو كل ساعة أو كل خمس دقائق ... الخ
__________________
Monzer Osama
Saudia Arabia - Jeddah
00966501826235
Microsoft Certified Business Management Solutions Professional
Microsoft Certified Trainer
Monzer Osama غير متواجد حالياً   رد مع اقتباس
إضافة رد


يتصفح الموضوع حالياً : 1 (0 عضو و 1 ضيف)
 
أدوات الموضوع
انواع عرض الموضوع

ضوابط المشاركة
لا تستطيع إضافة مواضيع جديدة
لا تستطيع الرد على المواضيع
لا يمكنك اضافة مرفقات
لا يمكنك تعديل مشاركاتك

BB code متاحة
كود [IMG] متاحة
كود HTML معطلة

الانتقال السريع

المواضيع المتشابهه
الموضوع كاتب الموضوع المنتدى مشاركات آخر مشاركة
سكربت لعمل تقرير خاص ب Analytical Accounting Maged Salah منتدى أكواد ومواضيع الـ SQL Server 5 20-Feb-2017 05:00 PM
مشكلة في اصدار رقم Po بشكل تلقائي wabbas77 مناقشة المشاكل والأخطاء في برنامج جريت بلينز 5 01-Sep-2012 11:45 PM
تطبيق Policy على المستخدمين moneimmae_2004 منتدى جريت بلينز العام 10 27-Feb-2012 02:39 PM
تطبيق الصلاحيات على المستخدمين moneimmae_2004 منتدى جريت بلينز العام 9 17-Dec-2011 10:59 PM
اري د سكربت marysamuel منتدى أكواد ومواضيع الـ SQL Server 7 12-Aug-2011 01:55 PM


جميع الأوقات بتوقيت GMT +3. الساعة الآن 12:33 PM.


Powered by vBulletin® Version 3.8.3

الموقع والمنتدى من تطوير » شركة المنذر للاستضافة والتصميم

Copyright © 2000-2010 Jelsoft Enterprises Limited.
الموقع لا يمثل أي جهة رسمية بل هو جهد شخصي يرمي الى تجميع القدرات في برنامج جريت بلينز