मेरे पास एक टेबल पर एक INSERT ट्रिगर है जो बस नौकरी निष्पादित करता है।

उदाहरण:

CREATE TABLE test
(
    RunDate smalldatetime
)

CREATE TRIGGER StartJob ON test 
AFTER INSERT 
AS
    EXEC msdb.dbo.sp_start_job 'TestJob'

जब मैं इस तालिका में एक रिकॉर्ड डालता हूं, तो नौकरी बिना किसी समस्या के निकाल दी जाती है। हालांकि, कुछ लोग हैं, जिनके पास मुझसे कम अनुमतियां हैं (db_datareader/db_datawriter केवल डेटाबेस पर); वे तालिका में एक रिकॉर्ड डालने में सक्षम हैं, लेकिन ट्रिगर सक्रिय नहीं होता है।

मैं एक SQL सर्वर नौसिखिया हूं और मैं इस धारणा के तहत था कि उपयोगकर्ताओं को ट्रिगर को बंद करने के लिए उन्नत अनुमतियों की आवश्यकता नहीं थी (मुझे लगा कि यह बड़े लाभों में से एक था!) क्या यह ट्रिगर स्तर पर या कार्य स्तर पर अनुमति की समस्या है? मैं इस सीमा को पार करने के लिए क्या कर सकता हूं?

1
Sesame 5 अप्रैल 2011, 20:54
ट्रिगर फायर करेगा। अगर उन्हें कोई त्रुटि नहीं मिलती है, तो मुझे लगता है कि msdb.dbo.sp_start_job वर्तमान भूमिका की जांच करता है और काम शुरू नहीं करता है जब तक कि उपयोगकर्ता एक विशिष्ट भूमिका में न हो। हालांकि ट्रिगर में ऐसा करना संभवतः अच्छी बात नहीं है।
 – 
Martin Smith
5 अप्रैल 2011, 20:58

2 जवाब

सबसे बढ़िया उत्तर

ट्रिगर कॉलर के संदर्भ में निष्पादित होगा, जिसके पास एमएसडीबी तक पहुंचने की अनुमति हो भी सकती है और नहीं भी। ऐसा लगता है कि आपकी समस्या है। Execute As का उपयोग करके इन अनुमतियों को विस्तारित करने के कुछ तरीके हैं; वे इस लिंक में बहुत विस्तृत हैं

ट्रिगर के भीतर प्रतिरूपण का प्रयोग करें:

CREATE TRIGGER StartJob ON test  
with execute as owner
AFTER INSERT 
AS
EXEC msdb.dbo.sp_start_job 'TestJob'

और डेटाबेस को भरोसेमंद पर सेट करें (या उपरोक्त लिंक में साइन इन करने के बारे में पढ़ें):

alter database TestDB set trustworthy on

जाने का एक और तरीका (एजेंट की नौकरी के संचालन के आधार पर) संग्रहीत प्रक्रिया सक्रियण को संभालने के लिए सेवा ब्रोकर कतार का लाभ उठाना होगा। आपके उपयोगकर्ताओं का संदर्भ केवल कतार में भेजने के लिए कॉल करेगा, जबकि एक अतुल्यकालिक प्रक्रिया में SvcBroker एक संग्रहीत प्रक्रिया को सक्रिय करेगा जो उच्च उन्नत उपयोगकर्ता के संदर्भ में निष्पादित होती है। मैं एजेंट की नौकरी बुलाने वाले ट्रिगर पर भरोसा करने के बजाय इस समाधान का विकल्प चुनूंगा।

मैं सर्विस ब्रोकर को कॉल का परीक्षण करना चाहता था, इसलिए मैंने यह सरल परीक्षण उदाहरण लिखा। एसएसआईएस पैकेज को कॉल करने के बजाय मैं बस एक ईमेल भेजता हूं, लेकिन यह आपकी स्थिति के समान ही है। ध्यान दें कि मैं स्क्रिप्ट के शीर्ष पर SET TRUSTWORTHY ON का उपयोग करता हूं। कृपया इस सेटिंग के प्रभावों के बारे में पढ़ें।

इस नमूने को चलाने के लिए आपको नीचे अपनी ईमेल प्रोफ़ाइल जानकारी, <your_email_address_here>, आदि को स्थानापन्न करना होगा।

use Master;
go
if exists(select * from sys.databases where name = 'TestDB')
    drop database TestDB;
create database TestDB;
go
alter database TestDB set ENABLE_BROKER; 
go
alter database TestDB set TRUSTWORTHY ON;

use TestDB;
go

------------------------------------------------------------------------------------
-- create procedure that will be called by svc broker
------------------------------------------------------------------------------------
create procedure dbo.usp_SSISCaller
as
set nocount on;
declare @dlgid uniqueidentifier;
begin try

    -- * figure out how to start SSIS package from here

    -- for now, just send an email to illustrate the async callback 
        ;receive top(1) 
                @dlgid = conversation_handle
        from SSISCallerQueue;

        if @@rowcount = 0
        begin
            return;
        end

        end conversation @dlgid;

    exec msdb.dbo.sp_send_dbmail 
        @profile_name           = '<your_profile_here>',
        @importance             = 'NORMAL',
        @sensitivity            = 'NORMAL',
        @recipients             = '<your_email_address_here>', 
        @copy_recipients        = '',
        @blind_copy_recipients  = '', 
        @subject                = 'test from ssis caller',
        @body                   = 'testing',
        @body_format            = 'TEXT'; 

    return 0;

end try
begin catch
    declare @msg varchar(max);
    select @msg = error_message();
    raiserror(@msg, 16, 1);

    return -1;
end catch;
go

------------------------------------------------------------------------------------
-- setup svcbroker objects
------------------------------------------------------------------------------------
create contract [//SSISCallerContract]
    ([http://schemas.microsoft.com/SQL/ServiceBroker/DialogTimer] sent by initiator)

create queue SSISCallerQueue 
    with status = on, 
    activation (    
        procedure_name = usp_SSISCaller,
        max_queue_readers = 1,
        execute as 'dbo' );

create service [//SSISCallerService] 
    authorization dbo
    on queue SSISCallerQueue ([//SSISCallerContract]);
go

return;


-- usage 
/*

-- put a row into the queue to trigger the call to usp_SSISCaller

begin transaction;

    declare @dlgId uniqueidentifier;

    begin dialog conversation @dlgId
                from service   [//SSISCallerService]
                to service      '//SSISCallerService', 
                                'CURRENT DATABASE'
                on contract     [//SSISCallerContract]
                with encryption = off;

    begin conversation timer (@dlgId)
            TIMEOUT = 5; -- seconds

commit transaction;
*/
2
Nathan Skerl 5 अप्रैल 2011, 22:16
नौकरी बस एक SSIS पैकेज को बंद कर देती है जो फ़ाइल शेयर पर संग्रहीत होता है। जैसा कि उल्लेख किया गया है, मैं केवल एक नौसिखिया हूं और निश्चित रूप से किसी भी सुझाव के लिए खुला हूं। मैं आपके विकल्प पर एक नज़र डालेगा।
 – 
Sesame
5 अप्रैल 2011, 21:15

यह कार्य स्तर पर अनुमति होगी। आप संभावित रूप से उन उपयोगकर्ताओं को MSDB में SQLAgentReaderRole असाइन कर सकते हैं ताकि वे नौकरी शुरू कर सकें, यह देखते हुए कि उन्हें नौकरी के स्वामित्व वाले समूह में जोड़ा जाएगा। यदि वे उस समूह में नहीं हैं जिसके पास नौकरी है, तो यह और अधिक कठिन हो जाता है।

1
Quantum Elf 5 अप्रैल 2011, 21:01