मैं इस चर ट्रिगर को कई चरों का उपयोग किये बिना कैसे लिखूं?मुझे अपने पहले टी-एसक्यूएल अपडेट ट्रिगर को अनुकूलित करने की आवश्यकता है
मैंने अपना पहला SQL सर्वर ट्रिगर लिखा और यह ठीक काम करता है, लेकिन मुझे लगता है कि, एक आसान समाधान होना चाहिए।
यदि न्यूनतम 5 कॉलम बदल दिए गए हैं तो मैं दूसरी तालिका में दो नई पंक्तियां लिखता हूं। पंक्ति 1 = पुराना फ़हरर (= चालक) और पुराना विस्फोट और अद्यतन-समय पंक्ति 2 = नया फ़हरर और नया विवाद और अद्यतन समय मेरा समाधान केवल फॉक्सप्रो-ट्रिगर की एक प्रति है, लेकिन टी में एक आसान समाधान होना चाहिए -एसक्यूएल यह जांचने के लिए कि एक कोलम बदल गया है या नहीं।
ALTER TRIGGER [dbo].[MyTrigger]
ON [dbo].[tbldisposaetze]
AFTER UPDATE
AS
SET NOCOUNT ON;
/*SET XACT_ABORT ON
SET ARITHABORT ON
*/
DECLARE @oldfahrer varchar(10)
DECLARE @oldbus varchar(10)
DECLARE @olddispodat date
DECLARE @oldvzeit decimal(4,0)
DECLARE @oldbzeit decimal(4,0)
DECLARE @oldbeschreibk varchar(255)
DECLARE @newfahrer varchar(10)
DECLARE @newbus varchar(10)
DECLARE @newdispodat date
DECLARE @newvzeit decimal(4,0)
DECLARE @newbzeit decimal(4,0)
DECLARE @newbeschreibk varchar(255)
SELECT @oldfahrer = fahrer,@oldbeschreibk=beschreibk,@oldbus=bus,@oldbzeit=bzeit,@olddispodat=dispodat,@oldvzeit=vzeit
FROM DELETED D
SELECT @newfahrer = fahrer,@newbeschreibk=beschreibk,@newbus=bus,@newbzeit=bzeit,@newdispodat=dispodat,@newvzeit=vzeit
FROM inserted I
if @oldbeschreibk <> @newbeschreibk or @oldbus <> @newbus or @oldbzeit <> @newbzeit or @oldfahrer <> @newfahrer or @oldvzeit <> @newvzeit
begin
IF (SELECT COUNT(*) FROM tbldispofahrer where [email protected] and [email protected]) > 0
update tbldispofahrer set laenderung = GETDATE() where [email protected] and [email protected]
else
INSERT into tbldispofahrer (fahrer,dispodat,laenderung) VALUES (@oldfahrer,@olddispodat,getdate())
IF (SELECT COUNT(*) FROM tbldispofahrer where [email protected] and [email protected]) > 0
update tbldispofahrer set laenderung = GETDATE() where [email protected] and [email protected]
else
INSERT into tbldispofahrer (fahrer,dispodat,laenderung) VALUES (@newfahrer,@newdispodat,getdate())
end
ठीक पहले आप बिल्कुल इस तरह वैरिएबल का उपयोग नहीं किया जाना चाहिए !! कभी भी किसी ट्रिगर में। हटाए गए और सम्मिलित तालिकाओं में एकाधिक रिकॉर्ड हो सकते हैं और आपको उस पर विचार करने के लिए कोड लिखना होगा। – HLGEM
आपके ट्रिगर में ** प्रमुख ** दोष है जिसमें आपको लगता है कि इसे ** प्रति पंक्ति ** ** कहा जाएगा - यह ** ** ** मामला नहीं है। ट्रिगर ** प्रति स्टेटमेंट ** ** पर आग लगाएगा, इसलिए यदि आपके 'अपडेट' स्टेटमेंट 25 पंक्तियों को प्रभावित करते हैं, तो आपको ** एक बार ** ट्रिगर मिलेगा, लेकिन फिर 'सम्मिलित' और 'हटाए गए' प्रत्येक में 25 पंक्तियां होंगी । उन 25 पंक्तियों में से कौन सा आपके 'चयन' कोड का चयन करेगा ?? यह गैर-निर्धारक है। इसे ध्यान में रखने के लिए आपको अपने ट्रिगर को फिर से लिखना होगा! –
आपकी 'tbldispofahrer' तालिका में प्राथमिक कुंजी कॉलम क्या है। –