مشکل سطح دسترسی به OpenRowSet
سلام دوستان، متاسفانه خیلی از ماها هنگامی که داریم با SQL Server کار میکنیم همیشه با دسترسی SA فعالیت میکنیم و هرجا هم نصب میکنیم معمولا با این سطح دسترسی کار میکنیم به همین خاطر ممکنه به خیلی از مشکلات برخورد نکنیم.حالا مشکلی که من باهاش برخورد کردم و یک هفته ای نیز درگیر حلش بودم به شرح زیر است. در سازمانی که فعالیت میکنم بامنتقل کردن دیتابیس ها به Data Center و تغییر سطوح دسترسی به کاربران دیتابیس ها مشکل عجیبی برامون پیش اومد.مشکل از این قرار بود که در نرم افزار فوق با استفاده از OpenRowSet داده ها از فایل Excel خوانده شده و در دیتابیس اضافه می شود.وقتی شما سطح دسترسی رو از sysadmin به db_owner یک دیتابیس خاص این دستور اجرا نمیشه و باید چند مرحله برای کار کردن آن انجام بشه. خوب ابتدا باید به کاربر فوق دسترسی Server Role BulkAdmin رو بدین.بعد باید در Securable نیز دسترسی Administer Bulk Operation رو بدین. همچنین باید Adhoc Query نیز بر روی سرور فعال باشد. بعد سرویس اکانتی که باهاش SQL Server اجرا شده نیز باید به مسیر فایل Excel دسترسی داشته باشد. خوب با انجام اینکار ها باید دستور به راحتی اجرا شود. ولی خیر.
مشکل از این قرار است که در Server Object ها در لیست provider ها شما وقتی روی یک Provider راست کلیک کرده Properties رو میزنید یک گزینه به نام DisallowQueryAccess داره باید غیر فعال باشه وگرنه اجازه اجرا شدن به شما رو نمیده و پیغام Access Denied میده.حالا اگر این گزینه رو بزنید یک کلید در Registry در مسیر HKLM\Software\Microsoft\Microsoft SQL Server\MSSQL11.InstanceName\Provider\Provider Name ایجاد میکنه به همین نام و مقدارش رو 1 قرار میده.ولی اگر اونو غیر فعال کنید SQL Server اون کلید رو به جای اینکه از 1 به 0 تغییر بدهد اون کلید را کلا حذف می کند.وقتی که از کاربر بغیر sysadmin برای اجرای این دستور استفاده می کنید ، SQL Server به صورت پیش فرض مقدار این کلید را 1 قرار میدهد و به همین خاطر به شما پیغام Access Denied میدهد.برای رفع این مشکل باید این کلید را خودتان در مسیری که ذکر شد دستی ایجاد کرده و مقدار 0 بدهید تا مشکل حل شود در غیر اینصورت به جز دسترسی sysAdmin نمیتوانید این دستور را اجرا کنید.این هم درحال حاضر یک Bug مربوط به SQL Server هست که قراره در نسخه بعدی حل بشه ولی این راه حل موقت میتونه فعلا مشکل رو حل کنه.