मेरे पास एक टेबल पर एक 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 सर्वर नौसिखिया हूं और मैं इस धारणा के तहत था कि उपयोगकर्ताओं को ट्रिगर को बंद करने के लिए उन्नत अनुमतियों की आवश्यकता नहीं थी (मुझे लगा कि यह बड़े लाभों में से एक था!) क्या यह ट्रिगर स्तर पर या कार्य स्तर पर अनुमति की समस्या है? मैं इस सीमा को पार करने के लिए क्या कर सकता हूं?
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;
*/
यह कार्य स्तर पर अनुमति होगी। आप संभावित रूप से उन उपयोगकर्ताओं को MSDB में SQLAgentReaderRole असाइन कर सकते हैं ताकि वे नौकरी शुरू कर सकें, यह देखते हुए कि उन्हें नौकरी के स्वामित्व वाले समूह में जोड़ा जाएगा। यदि वे उस समूह में नहीं हैं जिसके पास नौकरी है, तो यह और अधिक कठिन हो जाता है।
संबंधित सवाल
नए सवाल
sql-server
Microsoft SQL सर्वर एक रिलेशनल डेटाबेस मैनेजमेंट सिस्टम (RDBMS) है। कॉम्पैक्ट, एक्सप्रेस, एज़्योर, फास्ट-ट्रैक, एपीएस (पूर्व में पीडीडब्ल्यू) और एज़्योर SQL डीडब्ल्यू सहित सभी SQL सर्वर संस्करणों के लिए इस टैग का उपयोग करें। अन्य प्रकार के DBMS (MySQL, PostgreSQL, Oracle, आदि) के लिए इस टैग का उपयोग न करें। सॉफ़्टवेयर और मोबाइल विकास के मुद्दों के लिए इस टैग का उपयोग न करें, जब तक कि यह सीधे डेटाबेस से संबंधित न हो।
msdb.dbo.sp_start_job
वर्तमान भूमिका की जांच करता है और काम शुरू नहीं करता है जब तक कि उपयोगकर्ता एक विशिष्ट भूमिका में न हो। हालांकि ट्रिगर में ऐसा करना संभवतः अच्छी बात नहीं है।