الوصول إلى قاعدة بيانات Oracle من خلال SQL Server باستخدام OPENROWSET

StackOverflow https://stackoverflow.com/questions/448077

سؤال

أحاول الوصول إلى قاعدة بيانات Oracle كبيرة من خلال SQL Server باستخدام OPENROWSET في Javascript من جانب العميل، ولم يحالفني الحظ كثيرًا.وهنا التفاصيل:

  • تعمل طريقة عرض SQL Server التي تصل إلى قاعدة بيانات Oracle باستخدام OPENROWSET بشكل مثالي، لذلك أعلم أن لدي معلمات سلسلة اتصال صالحة.ومع ذلك، فإن المتطلب الجديد هو استعلامات Oracle الديناميكية للغاية التي تعتمد على التحديدات من جانب العميل، ولم أتمكن من الحصول على استعلامات Oracle الديناميكية (أو حتى ذات المعلمات) للعمل من طرق عرض SQL Server أو الإجراءات المخزنة.
  • يعمل الوصول من جانب العميل إلى قاعدة بيانات SQL Server بشكل مثالي مع الاستعلامات الديناميكية والمعلمات.
  • لا يمكنني الاعتماد على العملاء الذين لديهم أي برنامج عميل Oracle.لذلك، يجب أن يتم الوصول إلى قاعدة بيانات Oracle من خلال قاعدة بيانات SQL Server، باستخدام طرق العرض أو الإجراءات المخزنة أو الاستعلامات الديناميكية باستخدام OPENROWSET.
  • نظرًا لأن قاعدة بيانات SQL Server موجودة على خادم مشترك، فلا يُسمح لي باستخدام قواعد البيانات المرتبطة عالميًا.

كانت فكرتي هي تحديد وظيفة من شأنها أن تأخذ نسختي الخاصة من استعلام Oracle ذي معلمات، وإجراء بدائل المعلمات، ولف الاستعلام في OPENROWSET، وتنفيذه في SQL Server، وإرجاع مجموعة السجلات الناتجة.إليك نموذج التعليمات البرمجية:

// db is a global variable containing an ADODB.Connection opened to the SQL Server DB
// rs is a global variable containing an ADODB.Recordset
. . .
ss = "SELECT myfield FROM mytable WHERE {param0} ORDER BY myfield;";
OracleQuery(ss,["somefield='" + somevalue + "'"]);
. . .
function OracleQuery(sql,params) {
  var s = sql;
  var i;
  for (i = 0; i < params.length; i++) s = s.replace("{param" + i + "}",params[i]);
  var e = "SELECT * FROM OPENROWSET('MSDAORA','(connect-string-values)';"
    + "'user';'pass','" + s.split("'").join("''") + "') q";
  try {
    rs.Open("EXEC ('" + e.split("'").join("''") + "')",db);
  } catch (eobj) {
    alert("SQL ERROR: " + eobj.description + "\nSQL: " + e);
  }
}

خطأ SQL الذي أتلقىه هو Ad hoc access to OLE DB provider 'MSDAORA' has been denied. You must access this provider through a linked server. وهذا لا معنى له بالنسبة لي.يتعلق تفسير Microsoft لهذا الخطأ بإعداد التسجيل (DisallowAdhocAccess).تم تعيين هذا بشكل صحيح على جهاز الكمبيوتر الخاص بي، ولكن من المؤكد أن هذا يتعلق بخادم قاعدة البيانات وليس بجهاز الكمبيوتر العميل، وأتوقع أن الإعداد هناك صحيح نظرًا لأن العرض المذكور أعلاه يعمل.

أحد البدائل التي جربتها هو إزالة EXEC المرفق في البيان المفتوح:

rs.Open(e,db);

ولكن هذا يولد نفس الخطأ.

لقد حاولت أيضًا وضع OPENROWSET في إجراء مخزن.يعمل هذا بشكل مثالي عند تنفيذه من داخل SQL Server Management Studio، ولكنه يفشل مع نفس رسالة الخطأ عند استدعاء الإجراء المخزن من Javascript.

هل ما أحاول فعله ممكن؟إذا كان الأمر كذلك، هل يمكنك التوصية بكيفية إصلاح الكود الخاص بي؟أم أن اتباع نهج مختلف تماما ضروري؟

أي تلميحات أو معلومات ذات صلة سيكون موضع ترحيب.شكرا لك مقدما.

هل كانت مفيدة؟

المحلول

أنا أجيب على هذا بنفسي.لقد وجدت الجواب، وأنا لست سعيدا بالنتائج.يتم تشغيل الوظائف التي نجحت ضمن معرف المستخدم الشخصي الخاص بي، ولدي امتيازات مالك قاعدة البيانات.ل مخصصة الوصول إلى العمل، ولست بحاجة إما إلى تعيين DisallowAdhocAccess إعداد التسجيل على 0، أو منح امتيازات مالك قاعدة البيانات لمعرف المستخدم المستخدم في الوصول إلى الويب.ونظرًا لأن هذا خادم مشترك يتمتع بإجراءات أمنية مشددة، فلن يُسمح لي بتغيير إعداد التسجيل، الأمر الذي قد يؤثر على ما هو أكثر بكثير من قاعدة البيانات الخاصة بي.وأنا أعتبر الخيار الثاني خطيرًا بنفس القدر.

ونتيجة لذلك، يبدو أنني عالق في إجبار المستخدمين على تثبيت Oracle Instant Client حتى أتمكن من فتح اتصال ADO بقاعدة بيانات Oracle مباشرة في Javascript من جانب العميل.

وسأظل أرحب بأي أفكار بديلة حول هذا الموضوع.

نصائح أخرى

يعد فتح اتصالات ADO من جانب العميل بقاعدة بيانات بمثابة حظر أمني كبير.أنت تمنح المستخدم بشكل أساسي بيانات اعتماد الاتصال بقاعدة البيانات الخاصة بك وتشجعه على العثور على ثغرة في أمان قاعدة البيانات الخاصة بك.حتى لو كان جمهورك داخليًا في شركتك، فقد تواجه مشكلات بسبب عدم تثبيت برامج تشغيل Oracle (أو إصدار أقدم).لماذا لا تخفي استعلام Oracle خلف استدعاء JSON؟بهذه الطريقة يمكنك تطهير إدخال قاعدة البيانات الخاصة بك على جانب الخادم، ولن يتلق المستخدم مطلقًا بيانات اعتماد اتصال قاعدة البيانات بنص عادي.

حاول أن توصي بخادم مرتبط في مربع sqlserver الخاص بكhttp://msdn.microsoft.com/en-us/library/ms188279.aspx لاستخدامها في الحصول على بيانات أوراكل

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top