سلام دوستان
اين هم تاپيک sql server که ديتابيسي بسيار مناسب براي برنامه نويسهاي ايراني مي باشد.
سلام دوستان
اين هم تاپيک sql server که ديتابيسي بسيار مناسب براي برنامه نويسهاي ايراني مي باشد.
من به يك مشكل برخورد كردم... :? درواقع من در جايي كار ميكنم كه يك Sql Server 2000 نصب است و افراد گوناگوني با آن كار ميكنند چند وقتي است كه Sql Server Agent از كار افتاده و job ها اجرا نميشوند.بدين معنا كه Sql Server Agent Start نمي شود. با اين عنوان تمام سايتهاي ممكن كه راه حلي اراپه داده بودند را رفتم ولي به نتيجه نرسيدم. درواقع بدون دادن Error اين سرويس Start نميشه.
من از log اون يك كپي هم برداشتم كه بد نيست اين پايين بيارمش...
2005-04-25 14:09:16 - ! [165] ODBC Error: 0, Cannot generate SSPI context [SQLSTATE HY000]
2005-04-25 14:09:16 - ! [000] Unable to connect to server '(local)'; SQLServerAgent cannot start
2005-04-25 14:09:17 - ? [098] SQLServerAgent terminated (normally)
همچنين services رو هم دستي اجرا كردم ولي فايده اي نداشت. چي كار كنم؟
سلام
بهتره properties مربوط به Sql Server Agent را چک نماييد.
شايد هم آي پي يا نوع login به هم خورده باشند.
براي اطلاعات بيشتر راجع به error مورد نظر شما به لينک زير مراجعه نماييد:
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
يا علي
با سلام خدمت رامبد جان می شه این برنامه رو از اول اول توضیح بدین لطفا
سلام
آقای اجه آسمان اين برنامه يه کتاب داره 400 صفحه شما برو بخوار بد بخون اگه نفهميدی ما ميگيم بهت رامبد جان توضيحی نداره اين مبحث ديگه اشن هست که چی بايد توش باشه اينجا قسمت آموزش نيست قسمت سؤال های الکی هم نيست اينشون يه سؤال کاملاً درست پرسيده که عجيب هست
سلام
چگونگي ساختن job در SQL Server 2000 در صفحه asp که در زمان خاصي به افراد ميل زده شود
سطح: پيشرفته
کاربرد: زماني که تعداد زيادي آدرس اي ميل در يکي از ديتابيسهاي sql server داريد و مي خواهيد در روزهاي خاصي و در ساعت مشخصي به اين افراد ميل زده شود از اين اسکريپت استفاده مي شود.
لازم به ذکر است جهت ايجاد يک job حداقل نياز به ست کردن چهار آيتم مي باشد که عبارتند از:
sp_add_job
sp_add_jobstep
sp_add_jobschedule
sp_add_jobserver
جهت اطلاع از هر کدام از موارد مطروحه به books online خود sql server مراجعه نماييد.
پس از ست کردن چهار آيتم فوق به سراغ ديتابيس مورد نظر رفته و رکوردهاي تيبل خاصي را که در آن
آدرس اي ميل وجود دارند را در نظر مي گيريم.
کل کد به صورت زير مي باشد.
توجه داشته باشيد که بايد نام server نام ديتابيس و نام تيبل و نام فيلدها و نام کاربري و رمز کاربري
جهت اتصال به sql server را تنظيم نماييد.
ضمنا server شما بايد از امکان CDONT پشتيباني نمايد تا ارسال ميل با مشکل مواجه نشود.
سرورهاي قدرتمند حتما از اين آبجکت پشتيباني مي نمايند.
توجه داشته باشيد که من براي سهولت اصلاح کد محل قرار دادن متغيرها را به صورت زير تعيين کرده ام:
نام سرور را SERVERNAME
نام ديتابيس DATABASENAME
نام تيبل EmailTable
فيلدهاي موجود در تيبل: [From], [To], [Subject], [Body]
نام کاربري: USERID
رمز کاربري: PASSWORD
و اما کد مورد نظر:
کد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
با سلام و تشکر از زحمات رفقا مخصوصا رامبد خان ، آقا منظور من این نیس که شما بیاین و کتال 400 صفحه ای رو مو به مو توضیح بدین من می گم اگه براتون ممکنه یه پروژه کوچک شروع بشه و پله پله بالا بره طوری که یه شخص بتونه با پی گیری آن بتونه یه برنامه بسازه چون فکر کنم اکثر برنامه های موجود در بازار نیز همشون تا یه حدی از امکانات این برنامه استفاده میکنن پس به نظرم یه پروژه طوری شروع بشه که فرد بتونه با اون، آخر سر یه برنامه کامل بسازه البته زحمتش پای رفقاست و تا نظر اساتید چی باشهنوشته شده توسط ooje_asman
زبان SQL تنها زبان استاندارد و جامع پيادهسازي، مديريت، نگهداري و كار با بانكهاي اطلاعاتي ميباشد كه تقريباً توسط تمام بانكهاي اطلاعاتي كوچك و بزرگ مانند Access، SQL Server، Oracle و DB2 پشتيباني ميشود. طراحان و افرادي كه بنوعي با بانكهاي اطلاعاتي سروكار دارند و همچنين برنامه نويساني كه از اين بانكها استفاده ميكنند هركدام بايد تا اندازهاي با اين زبان آشنايي داشته باشند. اين مقاله كه در سه قسمت تهيه شده است ميكوشد تا مفاهيم زبان SQL را در قالب يك مثال كاربردي بيان كند. هرچند كه مفاهيم بكار رفته در اين مقاله در تمامي بانكهاي اطلاعاتي قابل پيادهسازي ميباشند ولي مثالهاي ارائه شده در 2000 SQL Server مورد تست قرار گرفتهاند.
بانك اطلاعاتي كه در اين مقاله بعنوان مثال مورد استفاده قرار گرفته است بانك اطلاعاتي يك آموزشگاه ميباشد كه شامل دو جدول بنامهاي teachers و students ميباشد. جدول اول اطلاعات اساتيد و جدول دوم اطلاعات دانشجويان را در خود نگه ميدارد. جدول اول داراي چهار فيلد زير ميباشد: name يا نام از نوع text، family يا فاميل از نوع text، age يا سن از نوع عدد، salary يا حقوق از نوع عدد.
جدول دانشجويان نيز شامل چهار فيلد ميباشد، سه فيلد اول آن مشابه سه فيلد اول جدول اساتيد ميباشد و فيلد چهارم آن عبارتست از GPA يا معدل كه يك فيلد عددي است.
زبان SQL داراي دستورات متنوع و نسبتاً زيادي ميباشد. به اين دستورات Clause نيز گفته ميشود. در اين مقاله و قسمتهاي بعدي آن تعدادي از مهمترين Clauseهاي زبان SQL مورد بررسي قرار ميگيرند.
1 – دستورهاي SELECT و FROM :
هدف نهايي از دادن انبوه اطلاعات به كامپيوتر، جستجو و يافتن اطلاعات مفيد ميباشد. به اين عمل يعني جستجوي اطلاعات در بانك اطلاعاتي Query نيز گفته ميشود. اكثر دستورات زبان SQL نيز در همين راستا مورد استفاده قرار ميگيرند. در اين بين مهمترين و پركاربردترين دستور را ميتوان دستور SELECT قلمداد كرد.
اين دستور جهت انتخاب يك يا چند فيلد از يك يا چند جدول مختلف مورد استفاده قرار ميگيرد، فيلدهاي انتخاب شده پس از اجراي query روي صفحه نمايش داده خواهند شد.
بعنوان مثال اگر در بانك اطلاعاتي فرضي خودمان بخواهيم اسم و فاميل تمام دانشجويان را مشاهده كنيم بايد برنامهاي به شكل زير بنويسيم:
SELECT name, family
FROM students
در اين برنامه كه به زبان SQL استاندارد نوشته شده است از دو دستور SELECT و FROM استفاده شده است. دستور SELECT مشخص ميكند كه چه فيلدهايي از جدول بايد نمايش داده شوند و دستور FROM نيز مشخص كننده جدولي است كه قرار است اطلاعات از داخل آن استخراج شوند. حال اگر بخواهيم نام و فاميل تمام اساتيد را ببينيم برنامه بالا را بايد بصورت زير تغيير دهيم:
SELECT name, family
FROM teachers
همان طوري كه از مثالهاي بالا نيز مشخص است جلوي دستور SELECT نام فيلدهايي نوشته ميشوند كه قرار است نمايش داده شوند و بعنوان جداكننده نيز بايد از كاراكتر كاما استفاده كرد. در صورتي كه بخواهيم تمام فيلدهاي يك جدول را ببينيم ميتوانيم بجاي نوشتن اسم تمام فيلدها فقط از يك كاراكتر ستاره استفاده كنيم. كاراكتر ستاره بمعني تمام فيلدهاي يك جدول ميباشد. مثلاً دو دستور زير با هم معادلند:
SELECT *
SELECT name, family, age, gpa
2 – دستور WHERE :
دستور SELECT همان طوري كه گفته شد جهت انتخاب و نمايش تعدادي از فيلدهاي جداول مورد استفاده قرار ميگيرد. در اين حالت تمام ركوردها نمايش داده خواهند شد، ولي در بيشتر موارد هدف از نوشتن Query نمايش ركوردهايي است كه داراي شرايط ويژهاي ميباشند مثلاً نمايش مشخصات اساتيدي كه بيش از پنجاه سال سن دارند. دستور WHERE براي گذاشتن يك يا چند شرط به دستور SELECT مورد استفاده قرار ميگيرد. با اضافه كردن شرط به دستور SELECT تعداد ركوردهاي خروجي (پاسخ) معمولاً محدودتر ميشود. بعنوان مثال اگر بخواهيم مشخصات اساتيدي كه بيش از چهل سال سن دارند را ببينيم بايد برنامهاي بصورت زير بنويسيم:
SELECT *
FROM teachers
WHERE age > 40
در اين برنامه شرط age > 40 با استفاده از دستور WHERE به Query اضافه شده و باعث شده است تا فقط مشخصات اساتيدي نمايش داده شوند كه در اين شرط صدق ميكنند يعني بيش از چهل سال سن دارند.
حال اگر بخواهيم مشخصات دانشجوياني را كه نام آنها علي ميباشد و سن آنها نيز كمتر از پانزده سال است را ببينيم بايد Query زير را اجرا كنيم:
SELECT *
FROM students
WHERE age < 15 AND name = 'ali'
در مثال بالا دو مطلب جديد وجود دارد نخست آنكه در زبان SQL رشته متني را بايد داخل كوتيشن (‘) قرارداد. بنابراين براي معرفي كلمهاي بنام علي بايد آنرا بصورت ‘ali’ نوشت، زيرا در اين حالت اين كلمه يك ثابت رشتهاي (متني) بحساب ميآيد. نكته ديگر آنكه ميتوان شرطهاي مختلف را توسط AND، OR و NOT با همديگر ادغام كرده و شرطهاي پيچيدهتري را بدست آورد. AND، OR و NOT هر سه از كلمات كليدي زبان SQL ميباشند. بعنوان يك مثال ديگر فرض كنيد ميخواهيم مشخصات تمام دانشجوياني را كه نام آنها، علي يا رضا نباشند را پيدا كنيم، برنامهاي كه اين Query را انجام ميدهد بصورت زير ميباشد:
SELECT *
FROM students
WHERE name NOT IN ('ali', 'reza')
در صورتي كه NOT را از برنامه بالا حذف كنيم مشخصات تمام دانشجوياني كه نام آنها علي يا رضا ميباشند نمايش داده خواهد شد.
در اين برنامه نيز يك كلمه كليدي جديد وجود دارد: IN كه براي تست عضويت در يك مجموعه بكار ميرود. مجموعهاي كه بادستور IN بكار ميرود ميتواند دهها عضو داشته باشد و نوع اعضا نيز ميتواند رشتهاي، عددي يا ... باشد. البته واضح است كه تمام اعضا بايد هم نوع باشند.
حال بعنوان يك مثال پيشرفتهتر ميخواهيم مشخصات دانشجوياني را ببينيم كه اسم فاميل آنها به ‘ زاده’ ختم ميشود مانند عليزاده، محمد زاده و ... براي اين منظور بايد Query زير را نوشته و اجرا كنيم:
SELECT *
FROM family LIKE '% zadeh'
كاربراني كه با Access كار ميكنند بايد سطر آخر را به صورت زير تغيير دهند:
WHERE family LIKE '*zadeh'
در اين مثال از Wildcardها استفاده شده است كه قبلاً با مفهوم آن در DOS و Windows يا حتي Unix آشنا شدهايم (ls a*) . در Wildcard ،SQL هايي به شرح زير وجود دارند:
% (در Access از * استفاده كنيد): اين Wild card نشانگر هر تعدادي از كاراكترها (هر كاراكتري) ميباشد.
- (در Access از ? استفاده كنيد): اين Wildcard نشانگر يك كاراكتر ميباشد كه اين كاراكتر ميتواند هر كدام از كاراكترهاي مجاز كامپيوتر باشد.
جهت جستجو كردن فيلدهايي كه داراي يك الگوي (Pattern) خاصي هستند بايد از دستور LIKE و Wildcardها استفاده كرد. در مثال زير نام و سن تمام اساتيدي كه اسم آنها با Pe شروع ميشود، نمايش داده خواهد شد.
SELECT name, age
FROM teachers
WHERE name LIKE 'Pe%'
بنابراين مشخصات افرادي كه نام آنها مثلاً پدرام يا پيمان باشد در خروجي ليست خواهد شد.
3 – دستور ORDERBY :
دستور ORDERBY جهت Sort كردن ركوردهاي نمايش داده شده مورد استفاده قرار ميگيرد. با اين دستور ميتوان مشخص كرد كه ركوردهايي كه قرار است نمايش داده شوند برحسب كدام فيلد بايد مرتب شوند. بعنوان مثال براي مشاهده كردن مشخصات اساتيدي كه سن آنها بيشتر از 29 سال ميباشد و در ضمن ليست خروجي بترتيب اسم فاميل نيز مرتب شده باشد بايد Query زير را اجرا كرد.
SELECT *
FROM teachers
ORDERBY family
در اين حالت افراد بترتيب اسم فاميل خود ليست خواهند شد. (از A تا Z) در صورتي كه بخواهيم ترتيب Sort شدن برعكس شود (از Z تا A) ميتوان پس از دستور ORDERBY از كلمه كليدي DESC استفاده كرد، مانند مثال زير
SELECT *
FROM teachers
ORDERBY DESC name
در اين مثال Sort شدن بترتيب اسم و نه بترتيب فاميل انجام ميگيرد.
براي دستور ORDERBY ميتوان چند فيلد تعريف كرد، در اين صورت اين دستور عمل Sort كردن را با در نظرگرفتن اولين فيلد انجام خواهد داد در صورتي كه چند ركورد داراي مقدار مشابهي در اين فيلد باشند ملاك مرتب سازي آنها فيلد دومي خواهد بود كه در دستور ORDERBY ذكر شده است، در صورتي كه اين فيلد نيز داراي مقادير مشابهي باشد ملاك تصميم گيري فيلد سوم خواهد بود والي آخر.
بعنوان مثال در Query زير نام اساتيدي كه بيش از 30 سال دارند برحسب فاميل آنها مرتب ميشود در صورتي كه چند استاد داراي اسم فاميل يكساني باشند ملاك مرتب شدن، اسم كوچك آنها خواهد بود.
SELECT *
FROM teachers
WHERE age > 30
ORDERBY family, name
4 – استفاده از توابع:
در دستور SELECT علاوه بر تعريف فيلدها ميتوان از عبارتهاي رياضي و يا توابع استاندارد SQL نيز استفاده كرد.
بعنوان مثال اگر ماليات بردرآمد پنج درصد باشد Query زير نام اساتيد و مالياتي را كه هر كدام ميپردازند را مشخص ميكند.
SELECT family, name, salary*5/100
FROM teachers
علاوه بر عبارتهاي رياضي ميتوان از توابع استاندارد SQL نيز استفاده كرد، تعدادي از اين توابع عبارتند از:
تابع COUNT : تعداد فيلدها را برميگرداند.
تابع SUM : مجموع يك فيلد عددي را برميگرداند.
تابع AVG : ميانگين يك فيلد عددي را برميگرداند.
تابع MIN : مينيمم يك فيلد عددي را برميگرداند.
تابع MAX : ماكزيمم يك فيلد عددي را برميگرداند.
بعنوان مثال اگر بخواهيم تعداد اساتيد و مجموع حقوقهايي را كه به آنها پرداخت شده است را ببينيم ميتوانيم از Query زير استفاده بكنيم.
SELECT COUNT (name), SUM (Salary)
FROM teachers
5 – Queryهاي چند جدولي:
تمام Queryهايي كه تاكنون مشاهده كرديد، Queryهاي تك جدولي بودند بدين معني كه در هر Query فقط اطلاعات يك جدول مورد جستجو قرار ميگرفت. در SQL امكان نوشتن Queryهاي چند جدولي نيز وجود دارد. در اين حالت اطلاعات چند جدول بطور همزمان مورد جستجو قرار ميگيرد و حتي امكان مقايسه فيلدهايي از يك جدول با فيلدهايي از جدول ديگر نيز وجود دارد. اگر در بين جداولي كه در Query شركت داده ميشوند فيلدهاي هم نام وجود داشته باشد بايد نام آن فيلدها را Fully qualified كرد بدين معني كه ابتدا اسم جدول و سپس اسم فيلد را ذكر كرد. بين اسم جدول و اسم فيلد نيز بايد از يك كاراكتر نقطه (‘.’) استفاده كرد.
بعنوان مثال اگر بخواهيم ليست اساتيد و دانشجوياني كه داراي ارتباط فاميلي هستند را ببينيم ميتوانيم از Query زير استفاده بكنيم:
SELECT *
FROM students, teachers
WHERE students.family = teachers. Family
و يا اگر بخواهيم ليست اساتيدي را مشاهده كنيم كه سن آنها از سن برخي از دانشجويان كمتر است، ميتوانيم Query زير را اجرا كنيم:
SELECT teachers.family, teachers.name
FROM students, teachers
WHERE teachers.age < students.age
6 – كلام آخر:
كلام آخر اينكه زبان SQL برخلاف زبانهايي مانند C يا C++ يك زبان Case Sensitive نيست بدين معني كه به بزرگ يا كوچك بودن حروف حساس نميباشد. بنابراين به راحتي ميتوان دستورات و كلمات كليدي آنرا در هر برنامهاي با حروف كوچك يا بزرگ تايپ كرد.
يك نقص امنيتي در الگوريتم پنهان سازي مورد استفاده در پنهان كردن اسم رمز و Login ID در Microsoft Enterprise Manager for SQL Server 7.0 وجود دارد. اين مشكل زماني رخ ميدهد كه بخواهيد SQL Server جديدي را در Enterprise Manager نصب كنيد يا SQL server نصب شدهاي را ويرايش كنيد (منظور زماني است كه برخي مشخصههاي آن تغيير ميدهيد). اگر SQL Server ، Login name به جاي يك Domain ، User name ويندوز بكار رود و checkbox عنوان "Alway prompt for login name and password" ست نشده باشد، LoginID و اسم رمز به صورتي ضعيف پنهان شده و در رجيستري ذخيره ميشود.
هنگامي كه يك (database Administrator)DBA به داخل يك workstation با يك log ، Profile ميشود LoginID و اسم رمز، هر دو در كليد رجيستري ذخيره ميشوند، اين اطلاعات به عنوان يك فايل با نام NTUSER.DAT (در ويندوز NT) يا USER.DAT (در ويندوز 95 يا ويندوز 98) زماني كه كاربر logoff ميكند ذخيره ميشود. فرد متخاصم ميتواند اين فايل را در يك ويرايشگر متن باز كرده و DBA ، loginID و اسم رمز پنهان شده را ببينيد. فرد متخاصم ميتواند اسم رمز و login ID رمز شده پنهان شده را برگردانده و loginID و اسم رمز را بدست آورد. وجود اين مشكل امنيتي به متخاصمين محلي و راه دور اين اجازه را ميدهد كه اسم رمز Administrator سيستم را بدست آورده و كنترل كاملي روي پايگاه داده روي سرور داشته باشند. اين مشكل امنيتي در Microsoft Enterprise Manager for SQL server 7.0 وجود دارد. سيستم پنهان سازي كه براي پنهان كردن اسم رمز و SQL server ، LoginID نصب شده بكار ميرود، قابل كشف است. روش پنهان سازي از جانشيني الفبايي استفاده ميكند و هركدام از كاراكترهاي Unicode در اسم رمز با دو بايت متناسب با موقعيتشان در رشته، XOR شدهاند. اگر checkbox با عنوان “Always prompt for login name and password” هنگامي كه SQL server نصب ميشود ست نشده باشد، LoginID و اسم رمز به صورت ضعيفي در رجيستري در قسمت :
--------------------------------------
[HKEY_CURRENT_USER\SOFTWARE\Microsoft\MSSQLServer\S QLEW\Registered Server X]
--------------------------------------
ذخيره ميشود. اطلاعات ذخيره شده در HKEY_CURRENT_USER زماني در دسترس است كه كاربر در حال حاضر log شده باشد در اين حال زماني كه كاربر ويندوز NT به سيستم log ميشود يك كپي متفاوت از HKEY_URRENT_USER لود ميشود و هنگامي كه كاربر Logoff ميكند محتويات HKEY_URRENT_USER در فايل NTUSER.DAT يا USER.DAT ذخيره ميشود و اين فايلها را ميتوان در Notepad ويندوز باز كرد و loginID و اسم رمز را براحتي در آن ديد اگر DBA از يك workstation ديگري، به سيستم log كند، فايل NTUSER.DAT روي همان workstation كه كاربر از طريق آن به سيستم log شده است ذخيره ميشود.
براي حل اين مشكل امنيتي و استفاده مطمئن از SQL server، مايكروسافت پيشنهاد كرده كه از Windows Integrated security استفاده شود زيرا در مد Integrated security (امنيت يكپارچه)، اسم رمزها هيچگاه ذخيره نميشوند.
اگر SQL server ، LoginID براي Logging به يك سرور در Enterprise Manager تعيين شده باشد، مايكرسافت پيشنهاد ميكند كه از انتخاب “Always Prompt for Login name and password" براي جلوگيري ذخيره اسم رمزها در رجيستري استفاده كنيد.
هم اکنون 1 کاربر در حال مشاهده این تاپیک میباشد. (0 کاربر عضو شده و 1 مهمان)