"وسيط الخدمة" مدير الخادم " سا " غير قادر على الوصول إلى قاعدة البيانات في سياق الأمان الحالي

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

سؤال

أنا أعمل مع سكل سيرفر 2012 اكسبرس.

أنا أستخدم وسيط الخدمة لتشغيل إجراء مخزن بشكل غير متزامن.

يجب أن يصل إجراء التنشيط إلى قاعدة بيانات أخرى لتنفيذ إجراء مخزن آخر.هذا هو الرمز:

CREATE PROCEDURE [dbo].[GetNewCodes]
    @gintNewCodes bigint,   
    @presNewCodes tinyint,
    @levelNewCodes bigint,
    @quantityNewCodes smallint
AS

    -- Get new codes from INCIC database.
    DECLARE @return_value int,
            @xmlGenerated xml,
            @xmlString NVARCHAR(MAX)

    SET NOCOUNT ON;

        -- Set that this stored procedure is running
        update dbo.RunningSPs with (serializable) set conf_value = 1
        where sp_name = N'GetNewCodes'

        if @@rowcount = 0
        begin
            insert dbo.RunningSPs(sp_name, conf_value) values (N'GetNewCodes', 1)
        end

    EXEC    @return_value = [INCIC].[dbo].[ReadCodeBuffer]
            @gint = @gintNewCodes,
            @pres = @presNewCodes,
            @level = @levelNewCodes,
            @quantity = @quantityNewCodes,
            @xmlGenerated = @xmlGenerated OUTPUT

    SET @xmlString = cast(@xmlGenerated as nvarchar(max))

    -- Process these new codes on TRZ.
    EXEC dbo.ProcessCodes @XmlString = @xmlString

    -- Update that we are not running this procedure any more.
    update dbo.RunningSPs with (serializable) set conf_value = 0
    where sp_name = N'GetNewCodes'

    if @@rowcount = 0
    begin
        insert dbo.RunningSPs(sp_name, conf_value) values (N'GetNewCodes', 0)
    end

المشكلة هنا: [INCIC].[dbo].[ReadCodeBuffer], ، ورسالة الخطأ هي:

خطأ:50000
خطأ غير قابل للاسترداد في الإجراء جيتنوكوديس:916:مدير الخادم " سا "غير قادر على الوصول إلى قاعدة البيانات" إنسيك " في سياق الأمان الحالي.

لقد تابعت هذا البرنامج التعليمي لتنفيذ الخدمة ، طابور وتفعيل الإجراء المخزن.

كيف يمكنني إصلاح هذه المشكلة?

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

المحلول

قراءة استدعاء إجراء في قاعدة بيانات أخرى من إجراء تنشيط.

تكمن المشكلة في أن الإجراءات التي تم تنشيطها يتم تشغيلها ضمن تنفيذ كسياق مستخدم وعلى هذا النحو تخضع لقيود انتحال قاعدة البيانات (يتم وضعها في وضع الحماية داخل قاعدة البيانات).وأوضح كل شيء في توسيع قاعدة بيانات الانتحال باستخدام تنفيذ كما.

الحل هو التوقيع على الإجراء الذي تم تنشيطه وإنشاء مستخدم مشتق من شهادة التوقيع في قاعدة البيانات الهدف ، ومنح هذا المستخدم المشتق الأذونات المطلوبة.يظهر الرابط الأول مثالا كاملا.

نصائح أخرى

من الواضح أن إجابة ريموس روسانو نهائية وصحيحة.(أي شخص يتعامل مع خدمات وسيط يعرف خبرته وبلوق لا تقدر بثمن.)

أردت فقط أن توثيق تجربتي ، منذ جوجل سوف توجه إلى هذا السؤال عند البحث على "مدير الخادم " سا " غير قادر على الوصول إلى قاعدة البيانات..."

في حالتي ، كنت استدعاء قاعدة بيانات أخرى من داخل إجراء تنشيط ، ولكن استدعاء بيان سكل مباشرة ، وليس إجراء مخزن.

في الأصل ، عملت المكالمة عبر قاعدة البيانات بشكل جيد دون شهادة موقعة واستخدام انتحال الهوية.ثم ، بعد تغيير بناء جملة صغير ، بدأ في إرجاع رسالة الخطأ أعلاه.

إليك ما نجح دون الحاجة إلى شهادة موقعة:

IF  EXISTS (SELECT name FROM sys.databases WHERE name = N'MyOtherDb')

وهنا ما أثار الاستثناء الأمني:

IF DB_ID(N'MyOtherDb') IS NOT NULL
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top