برای یک پروژه قرار بود که بیام ساختار دیتابیس رو تغییر بدم و دادهها رو انتقال بدم به ساختار جدید. دو فایل به فرمت ldf و mdf به من داده شد که mdf فایل اصلی در دیتابیس است (Master Database File) و ldf میشه فایل پشتیبانی و لاگ اون (Log Database File)
طریقهی نصب SQL Server 2017 را در این لینک ببینید.
بعد از این برید و Microsoft SQL Server Management Studio 18 را اجرا کنید
نام سرور در مراحل نصب (لینک بالا) تعیین میشه (که من گذاشتم MSSQL2017) که در واقع همون instance_id هست.
اگر رو دکمه connect کلیک کردید و پیغام خطا داد، قبل از همه چیز مطمئن بشید که تمام سرویسها در حال اجرا هستند:
برید در منوی استارت و SQL Server 2017 Configuration Manager رو جستوجو و بازش کنید. مطمئن شید که state تمام سرویسها در حالت running هست.( اگر نیست روش کیلک راست کنید و start رو بزنید)
حالا برگردیم سر مرحلهی قبل و دکمهی connect رو بزنید.
اگر فایل بکاپ دارید که رو Databases کلیک راست کنید و Restore Databse رو بزنید. در پنجرهی باز شده چکباکس Device رو فعال کنید و رو دکمهی روبروش کلیک کنید. سپس روی Add و بعدش فایل بکاپ رو انتخاب کنید و همه چیز رو ok کنید (مراحلش آسون بود سریع رد کردم فقط)
ساخت کاربر
خوب حالا میخوایم یه کاربر بسازیم
برید رو فولدر Security و ساب فولدر Logins کلیک راست کنید و New Login... رو انتخاب کنید.
login name همون نامکاربری شما خواهد بود.(که من گذاشتم sqlserver2017)
چکباکس SQL Server Authentication رو فعال کنید و رمز عبور تعیین کنید.
چکباکس Enforce password expiration رو غیرفعال کنید.
نکتهی مهم Default database هست که باید همون دیتابیسی که import کردید رو بهش بدید (به طور دیگه بگم که اینجا دیتابیسی رو میدید که دوست دارید کاربری که دارید میسازید، پس از لاگین بهش دسترسی داشته باشه)
Server Roles
User Mapping
در بخش User Mapping، تیک دیتابیستون رو بزنید و در پایین نقش db_owner رو بهش بدید.(هر role که فک میکنید به دردش میخوره) و بعدش اوکی رو بزنید کارمون اینجا تمومه
نکته مهمی که هست و اگر مراحل رو با توجه به ویدیو بالا رفته باشید رو نیازی نیست انجام بدید
روی سرورتون کلیک راست کنید و properties رو انتخاب کنید و در تب security، گزینهی SQL Server and Windows Authentication mode رو انتخاب کنید و اوکی کنید.
سرور رو دوباره راهاندازی کنید تا تغییرات همهی کارهایی که کردیم اعمال شه.
یه نکتهی دیگه ای که شاید باهاش مواجه بشید:
من بنابر دلایلی مجبور شدم دو نسخهی 2014 و 2017 رو همزمان داشته باشم و این باعث شد که تداخل بوجود بیاد و لاراول نتونه وصل شه بهش و اومدم پورت نسخهی 2017 رو به این صورت تغییر دادم:
دوباره برگردید به Sql Server Configaration Manager
در بخش Sql Server Network Configuration
دو تا پروتکل دارم من (2014 و 2017). MSSQLSERVER نام دیفالتی هست که خودش میده موقع نصب و چون موقع نصب نسخهی 2014، گزینهی پیش فرض رو زدم این اومده (من به این کار ندارم)
رو TCP\IP کلیک راست کنید و properties رو بزنید و در انتهای بخش Ip Addresses، پورت TCP رو تغییر دادم به 8080. (مطمئن باشید که این پورت درسیستم شما بسته نیست)
لاراول
بگذریم حالا بریم سراغ لاراول :)
اول برید داخل فایل config/database.php
'sqlsrv' => [ 'driver' => 'sqlsrv', 'host' => env('DB_HOST_OLD', 'localhost'), 'port' => env('DB_PORT_OLD', '1433'), 'database' => env('DB_DATABASE_OLD', 'forge'), 'username' => env('DB_USERNAME_OLD', 'forge'), 'password' => env('DB_PASSWORD_OLD', ''), 'charset' => 'utf8', 'prefix' => '', 'prefix_indexes' => true, ],
تنها تغییراتی که دادم در این فایل، عوض کردن کلیدهای فایل env بود. (مثلا به صورت پیشفرض DB_DATABASE رو داریم و من تغییر دادم به DB_DATABASE_OLD چون همچنان دیتابیس پیشفرض پروژه من MySQL بودو نمیخواستم تغییرش بدم)
در فایل env. این کلیدها رو اضافه کنید:
DB_HOST_OLD=localhost DB_PORT_OLD=8080 DB_DATABASE_OLD=PerLex DB_USERNAME_OLD=sqlserver2017 DB_PASSWORD_OLD=123
دقت کنید که من در نرمفزار SQL Server یک کاربر جدید ایجاد کردم و نام کاربری و پسورد را اونجا درست کردم.
پورت هم که بالاتر تنظیم کردیم.
حالا برای دریافت دادهها از طریق این کانکشن باید این کارو کرد
DB::connection('sqlsrv')->table('Books')->get();
خوب اگر تعداد داده زیاد باشه (مثلا 100000 تا)، اینطوری منابع زیادی استفاده میشه. برای همین بهتر است از chunk استفاده کنیم.
DB::transaction(function (){ DB::connection('sqlsrv') ->table('Perlex.Source') ->orderBy('SourceId') ->chunk(100, function ($sources){ foreach ($sources as $source) { Source::create([ 'id' => $source->SourceId, 'book_id' => $source->BookId, 'page' => $source->PageNumber, 'line' => $source->LineNumber, 'text' => $source->Text, 'comment' => $source->Comment ]); } }); });
حالا ممکنه به همچین خطایی بخورید:
Illuminate\Database\QueryException : could not find driver
این یعنی درایور مربوطه نصب نیست. خب اول ببینید ورژن PHP شما چنده (برای من 7.2.14 بود) بعد برید به این سایت و با توجه به سیستم عامل و نسخهی پیاچپی فعال خودتون، درایور رو دانلود کنید. (یعنی من بایدWindows-7.2.zip رو دانلود میکردم)
وقتی فایل رو از حالت فشرده خارج کردید، برید داخل فولدر مربوط به سیستمعاملتون (برای من 64 بیتی هست، پس باید برم تو فولدر x64).
چهار تا فایل میبینید که در واقع 2 تا هست در دو مدل nts و ts که من از ts استفاده کردم.
این 2 تا فایل رو کپی کنید در فولد extensionهای php خودتون که برای من اینجا بود:
D:\wamp64\bin\php\php5.6.40\ext
D:\wamp64\bin\php\php7.2.14\ext
شاید بگید مگه ورژن PHP من 7.2.14 نبود! پس چرا فایل ها رو در ورژن 5.6.40 هم قرار دادم؟
اولا شاید برای شما لزومی نداشته باشه اینکارو بکنید ولی برای من لازم بود
چون وقتی wamp رو اجرا میکنم یه command prompt میاد و داخل اونجا میاد php.ini ورژن 5.6.40 من رو اول لود میکنه (انگار بیس بقیه ورژن هاس)
حالا برید به D:/wamp64/bin/php/php5.6.40/php.ini
مقدار Dynamic Extensions رو جستجو کنید و در همون بخش این دو خط رو اضافه کنید.
extension=php_sqlsrv_72_ts.dll extension=php_pdo_sqlsrv_72_ts.dll
حال همین کار رو برای ورژن دیگتون انجام بدید
extension=php_sqlsrv_72_ts extension=php_pdo_sqlsrv_72_ts
ومپ رو دوباره راهاندازی کنید (من باید خودم برنامه رو ببندم چون اگر ریستارت کنم فقط میاد 7.2 رو رفرش میکنه)
اگر ورژن درایورتون با PHP فرق داشته باشه خطای زیر رو خواهید دید.
php starup sqlsrv unable to initialize module module compiled with module api=20160303 php compiled with module api=20170718 these options need to match
تا کنون 0 نظر به ثبت رسیده است