คำถามติดแท็ก stored-procedures

รหัส Callable ที่ติดตั้งบนตัวจัดการฐานข้อมูลเปิดเผย API ซึ่งสามารถเรียกใช้ได้ โดยปกติแล้วจะเขียนด้วยภาษาคิวรีทั่วไปแพลตฟอร์ม DBMS บางภาษาก็รองรับภาษาอื่นเช่นกัน

2
การทำธุรกรรมในขั้นตอนการจัดเก็บ
ฉันต้องการดำเนินการ UPDATE และ INSERT ในธุรกรรมเดียว รหัสนั้นทำงานได้ดีในตัวของมันเอง แต่ฉันต้องการที่จะสามารถเรียกมันได้อย่างง่ายดายและผ่านพารามิเตอร์ที่ต้องการ เมื่อฉันพยายามทำธุรกรรมนี้ในขั้นตอนการจัดเก็บฉันพบข้อผิดพลาดทางไวยากรณ์มากมาย ฉันจะแค็ปซูลโค้ดต่อไปนี้เพื่อให้สามารถเรียกได้อย่างง่ายดาย? BEGIN TRANSACTION AssignUserToTicket GO DECLARE @updateAuthor varchar(100) DECLARE @assignedUser varchar(100) DECLARE @ticketID bigint SET @updateAuthor = 'user1' SET @assignedUser = 'user2' SET @ticketID = 123456 UPDATE tblTicket SET ticketAssignedUserSamAccountName = @assignedUser WHERE (ticketID = @ticketID); INSERT INTO [dbo].[tblTicketUpdate] ([ticketID] ,[updateDetail] ,[updateDateTime] …

1
แทรกผลลัพธ์จากกระบวนงานที่เก็บไว้ในตัวแปรตาราง
ฉันมีขั้นตอนการจัดเก็บที่เก็บค่าในตัวแปรตาราง ฉันเลือกค่าเหล่านี้และส่งคืนเมื่อเรียกใช้โพรซีเดอร์ ฉันกำลังพยายามตั้งค่าส่งคืนเหล่านี้ในตัวแปรตารางอื่น แต่ฉันไม่สามารถหามันได้ ขั้นตอนการเก็บ ALTER PROCEDURE [dbo].[GetOrSetDomainId] @DomainName varchar(50), @DomainUrl varchar(50) AS BEGIN DECLARE @DomainId bigint; DECLARE @NumberOfRwos bigint; DECLARE @DomainHistory TABLE ( DomainId bigint, HasHistory bit, ServerOnline bit, DatabaseOnline bit, ServerPerformance bigint, DatabasePerformance bigint, SoldTickets bigint ) SELECT @NumberOfRwos = COUNT(Id) FROM DomainData WHERE DomainName = @DomainName OR …

1
สิทธิพิเศษที่จำเป็นสำหรับการใช้งานฟังก์ชั่นทริกเกอร์ใน PostgreSQL 8.4 มีอะไรบ้าง?
สิทธิพิเศษที่จำเป็นสำหรับการใช้งานฟังก์ชั่นทริกเกอร์ใน PostgreSQL 8.4 มีอะไรบ้าง? ดูเหมือนว่าสิทธิพิเศษที่กำหนดให้กับบทบาทนั้นไม่สำคัญสำหรับการเรียกใช้ฟังก์ชันทริกเกอร์ ฉันคิดว่าฉันได้เห็นบางวันว่าสิทธิ์ที่จำเป็นในการเรียกใช้ฟังก์ชันทริกเกอร์เป็นสิทธิ์ดำเนินการ แต่สำหรับเจ้าของตารางไม่ใช่บทบาทจริงที่ดำเนินการแอ็คชั่นซึ่งยิงทริกเกอร์ที่เรียกฟังก์ชันทริกเกอร์ ฉันไม่พบส่วนเอกสารที่อธิบายจุดนั้นมีความช่วยเหลืออะไรบ้าง?

1
ข้อผิดพลาด: ฟังก์ชัน set_valued เรียกในบริบทที่ไม่สามารถยอมรับชุดได้ มันเกี่ยวกับอะไร?
ฉันใช้ Postgresql 9.1 กับ Ubuntu 12.04 ได้รับแรงบันดาลใจจากคำตอบของ Craig ต่อคำถามของฉันการเรียง setof หรือ setof recordฉันคิดว่าฉันจะใช้return queryงานได้setof recordดีและเป็นตัวสร้างซีรีส์ในฟังก์ชั่น plpgsql นี้: create or replace function compute_all_pair_by_craig(id_obj bigint) returns setof record as $$ begin return query select o.id, generate_series(0,o.value) from m_obj as o; end; $$ language plpgsql; ในระหว่างการดำเนินการฉันได้รับข้อผิดพลาด: ERROR: set_valued function called in context that …

3
จัดทำเอกสารเว็บยักษ์ใหญ่ของขั้นตอนการจัดเก็บที่เกี่ยวข้องระหว่างกันในฐานข้อมูล MS SQL: เครื่องมือหรือรูปแบบใด
ฉันหวังว่านี่เป็นคำถามที่มีคำตอบสั้นกว่า "อ่านหนังสือ 1,000 หน้า" แต่ถ้าเป็นสถานการณ์จริงให้ฉันตอบด้วย ฉันไม่ใช่ DBA จริงฉันเป็นนักพัฒนาซอฟต์แวร์ที่รู้ตัวว่าเราต้องการ DBA และร้านค้าที่ฉันทำงานมี DBA เป็นศูนย์ อย่างไรก็ตามการออกแบบฐานข้อมูล MS SQL ของเรารวมถึงขั้นตอนการจัดเก็บหลักหลายอย่างนั้นเป็นเรื่องที่ยุ่งยาก ขั้นตอนการจัดเก็บนั้นช้าเราสงสัยว่ามีข้อบกพร่อง แต่เราไม่รู้ด้วยซ้ำว่าพวกมันคาดหวังว่าจะทำงานอย่างไรเราจึงไม่รู้วิธีแก้ไข เป็นการเริ่มต้นฉันตัดสินใจว่าเราจะบันทึกว่ามันควรจะทำงานอย่างไรทั้งหมดจากนั้นเราจะเริ่มการทดสอบหน่วยและสร้างชุดการทดสอบหน่วยที่ช่วยพิสูจน์ว่าขั้นตอนการจัดเก็บใช้งานได้จริง ตรรกะที่พวกเขาดำเนินการเป็นส่วนสำคัญของแอปพลิเคชันของเราคุณสามารถพูดได้ว่ามันเป็น "มงกุฎเพชร" ของผลิตภัณฑ์หลักของ บริษัท ของเราและวิธีการทำงานนั้นไม่มีเอกสารอย่างสมบูรณ์ ฉันกำลังมองหาเอกสารทางเทคนิคเฉพาะที่ DBA มืออาชีพอาจคาดหวังว่าจะมีอยู่หรืออาจเขียนด้วยตัวเองหากพวกเขาต้องเข้าใจเว็บยักษ์ของขั้นตอนการจัดเก็บที่เรียกกัน รูปแบบปกติสำหรับการบันทึกขั้นตอนการจัดเก็บขนาดใหญ่คืออะไร คำอธิบายของค่าที่คาดไว้สำหรับ In พารามิเตอร์แต่ละตัว (เช่น "preconditions", "postconditions" เช่นสำหรับพารามิเตอร์บูลีนจะมีการเปลี่ยนแปลงอย่างไรเมื่อคุณเปิดหรือปิด ฯลฯ ) โดยทั่วไปแล้วเอกสารจะมีวิธีการอย่างไร? ความคิดเห็น SQL เท่านั้น? การขับรถภายนอกที่เฉพาะเจาะจงกับวัตถุประสงค์? "เอกสาร" ภายนอกหรือไม่ เราไม่มีเครื่องมือ SQL นอกเหนือจากสตูดิโอการจัดการ MS SQL แต่เราสงสัยว่ามีเครื่องมือที่จะทำให้เข้าใจจัดทำเอกสารและทดสอบสภาพแวดล้อมของเราดีขึ้นหรือไม่ …

5
SQL Server เก็บผลลัพธ์ของกระบวนการแคชข้อมูลหรือไม่
ฉันเคยได้ยินเรื่องนี้จากเพื่อน แต่ฉันไม่เคยตรวจสอบว่าเรื่องนี้เป็นเรื่องจริงหรือไม่ เป็นความจริงหรือไม่ที่ผลลัพธ์ข้อมูลของคิวรีที่ดำเนินการถูกเก็บไว้ในแคช? ฉันหมายถึงถ้าฉันมีขั้นตอนการจัดเก็บเช่น: SELECT * FROM USERLIST ... เป็นความจริงหรือไม่ที่ผลลัพธ์ (รายการผู้ใช้ในกรณีนี้) ถูกเก็บไว้ในแคช นอกจากนี้ถ้าฉันมีสิ่งเหล่านี้: SELECT * FROM USERLIST WHERE user="user" SELECT * FROM USERLIST WHERE user="userzzz" (ผู้ใช้ / userzzz ถูกส่งผ่านเป็นพารามิเตอร์) ถูกต้องหรือไม่ว่ามันเก็บผลลัพธ์ที่แตกต่างกัน 2 รายการไว้ในแคชฐานข้อมูล ฉันไม่คิดอย่างนั้น แต่ฉันต้องการคำยืนยันจากคุณผู้เชี่ยวชาญ!

1
ข้อผิดพลาด PLS-00306: วิธีการหาอาร์กิวเมนต์ที่ผิด?
PLS-00306: หมายเลขหรือประเภทของอาร์กิวเมนต์ที่โทรหา 'string' ผิด สาเหตุ: ข้อผิดพลาดนี้เกิดขึ้นเมื่อการเรียกโปรแกรมย่อยที่มีชื่อไม่สามารถจับคู่กับการประกาศใด ๆ สำหรับชื่อโปรแกรมย่อยนั้น ชื่อโปรแกรมย่อยอาจสะกดผิดพารามิเตอร์อาจมีประเภทข้อมูลที่ไม่ถูกต้องการประกาศอาจผิดพลาดหรือการประกาศอาจวางไว้อย่างไม่ถูกต้องในโครงสร้างบล็อก ตัวอย่างเช่นข้อผิดพลาดนี้เกิดขึ้นหากฟังก์ชั่นสแควร์รูทในตัว SQRT ถูกเรียกด้วยชื่อที่สะกดผิดหรือด้วยพารามิเตอร์ของประเภทข้อมูลที่ไม่ถูกต้อง การดำเนินการ: ตรวจสอบการสะกดคำและการประกาศชื่อโปรแกรมย่อย นอกจากนี้ยังยืนยันว่าการโทรนั้นถูกต้องพารามิเตอร์นั้นเป็นประเภทข้อมูลที่ถูกต้องและหากไม่ใช่ฟังก์ชันในตัวการประกาศจะถูกวางไว้อย่างถูกต้องในโครงสร้างบล็อก ฉันจะระบุข้อโต้แย้งที่ผิดได้อย่างรวดเร็วได้อย่างไร ฉันมีขั้นตอนการจัดเก็บพร้อมพารามิเตอร์หลายสิบตัว มีวิธีง่าย ๆ ในการตรวจสอบความแตกต่างระหว่างขั้นตอนที่ใช้และขั้นตอนที่กำหนดหรือไม่ ฉันไม่ต้องการตรวจสอบทีละบรรทัด ..

3
เป็นวิธีที่ดีที่สุดในการเพิ่มการจัดการข้อผิดพลาดใน SQL 2005 procs จัดเก็บคืออะไร?
เป็นวิธีที่ดีในการทำให้ procs ที่เก็บไว้มีประสิทธิภาพเพียงพอที่จะสามารถปรับขนาดได้ดีมากและยังมีการจัดการข้อผิดพลาดอะไร นอกจากนี้วิธีที่ดีที่สุดในการจัดการสถานการณ์ข้อผิดพลาดหลายอย่างใน proc ที่จัดเก็บและมีระบบการตอบรับอัจฉริยะที่จะส่งคืนข้อมูลข้อผิดพลาดที่มีความหมายไปยังแอพที่โทรอยู่คืออะไร?

2
วิธีการเชื่อมต่อกับฐานข้อมูลอื่นโดยใช้ขั้นตอนการจัดเก็บ?
ฉันต้องการรับข้อมูลบางอย่างจากฐานข้อมูลภายนอกและทำการคำนวณบางอย่างกับฐานข้อมูลอื่นเป็นไปได้หรือไม่ที่จะเชื่อมต่อกับฐานข้อมูลภายนอกจากกระบวนงานที่เก็บไว้? ขอบคุณเพื่อน. PS ฉันใช้ Oracle และฐานข้อมูลทั้งสองอยู่ในเซิร์ฟเวอร์เดียวกัน

2
มีใครใช้คุณสมบัติ SQL Server เพื่อสร้างกลุ่มของขั้นตอนการจัดเก็บแตกต่างกันตามหมายเลขหรือไม่
คำถามหมายถึงพารามิเตอร์ number ในเอกสารคู่มือmsdnนี้ หากคุณไม่สามารถสร้างโพรซีเดอร์ที่เก็บไว้จำนวนมากใน SQL-Server สร้างความแตกต่างด้วยหมายเลขแล้วปล่อยด้วยการดรอปเพียงครั้งเดียว create procedure dbo.stored_proc1 as select 1 go create procedure dbo.stored_proc1;2 as select 2 go exec stored_proc1 -- returns 1 go exec stored_proc1;2 -- returns 2 go drop stored_proc1 -- drops both go ฉันสงสัยว่าทุกคนจะใช้คุณลักษณะนี้เพื่อประโยชน์หรือไม่หรือเป็นเพียงความอยากรู้อยากเห็นในอดีต

3
SQL Server แทรกเข้าไป - วิธีการระบุคอลัมน์ที่ทำให้เกิดข้อผิดพลาดการตัด
ฉันมีขั้นตอนการจัดเก็บที่แทรก 650 ฟิลด์ลงในตาราง การแทรกล้มเหลวด้วยข้อผิดพลาดการตัด มันง่ายมาก INSERT INTO SELECT (a bunch of fields) FROM (a bunch of tables) ด้านล่างนี้เป็นข้อความแสดงข้อผิดพลาด: ข่าวสารเกี่ยวกับ 8152, ระดับ 16, สถานะ 14, กระบวนงาน DSP_Procedure, สาย 1075 สายอักขระหรือข้อมูลไบนารีจะถูกตัดทอน มีวิธีที่รวดเร็วที่ฉันสามารถระบุฟิลด์ที่ทำให้เกิดข้อผิดพลาดการตัด? ความจริงที่ว่าคำสั่ง select ที่จะแทรกลงในตารางมี 650 ฟิลด์ทำให้ยากที่จะระบุว่าฟิลด์ใดที่ทำให้เกิดข้อผิดพลาดการตัด ฉันคิดว่าฉันสามารถแสดงความคิดเห็นบล็อกของเขตข้อมูลได้ครั้งละหนึ่งครั้งเพื่อให้มีการแทรก SP เพียง 100 ครั้งในแต่ละครั้งจากนั้นจึงเรียกใช้ SP 6 หรือ 7 ครั้งที่แตกต่างกันจนกว่าฉันจะแคบลงอย่างน้อย 100 กลุ่ม ที่จะมีฟิลด์ที่ทำให้เกิดข้อผิดพลาดการตัด อีกทางหนึ่งฉันคิดว่าบางทีฉันสามารถSELECT INTOสร้างตารางใหม่และเปรียบเทียบความยาวข้อมูลในตารางเทียบกับความยาวข้อมูลของตารางเป้าหมายที่ฉันพยายามแทรกลงใน …

4
วิธีสร้างแถวสำหรับทุกวันในช่วงวันที่โดยใช้กระบวนงานที่เก็บไว้ได้อย่างไร
ฉันต้องการสร้างกระบวนงานที่เก็บไว้ซึ่งจะสร้างแถวในตารางสำหรับทุกวันในช่วงวันที่ที่กำหนด กระบวนงานที่เก็บไว้ยอมรับสองอินพุต - วันที่เริ่มต้นและวันที่สิ้นสุดของช่วงวันที่ที่ผู้ใช้ต้องการ ดังนั้นสมมติว่าฉันมีตารางดังนี้ SELECT Day, Currency FROM ConversionTable Day คือ DateTime และ Currency เป็นเพียงจำนวนเต็ม เพื่อให้ง่ายขึ้นสมมติว่าฉันต้องการให้คอลัมน์สกุลเงินเป็น 1 สำหรับแต่ละแถวที่แทรกเหล่านี้ ดังนั้นหากมีคนป้อน '5 มีนาคม 2017' เป็นวันที่เริ่มต้นและ '11 เมษายน 2017' เป็นวันที่สิ้นสุดฉันต้องการสร้างแถวต่อไปนี้: 2017-03-05 00:00:00, 1 2017-03-06 00:00:00, 1 ... 2017-04-11 00:00:00, 1 วิธีที่ดีที่สุดในการเขียนโค้ดของกระบวนงานที่เก็บไว้เพื่อทำสิ่งนี้คืออะไร ฉันใช้ SQL Server 2008 R2 ในสภาพแวดล้อมการทดสอบของฉัน แต่สภาพแวดล้อมจริงของเราใช้ SQL Server 2012 ดังนั้นฉันสามารถอัพเกรดเครื่องทดสอบของฉันได้หากมีฟังก์ชั่นใหม่ที่เปิดตัวในปี …

5
ฉันจะตรวจพบโพรซีเดอร์ที่เก็บที่เสียหายหลังจากการเปลี่ยนแปลงสกีมา
ฉันได้แก้ไขตารางกลางในฐานข้อมูลของฉันและ sp_depends ส่งคืนผลลัพธ์หลายร้อยรายการอย่างแท้จริงและฉันกังวลว่าบางขั้นตอนการจัดเก็บอาจไม่ได้รวบรวมอีกต่อไปหลังจากการเปลี่ยนแปลงของฉัน การตรวจสอบหนึ่งโพรซีเดอร์ที่เก็บไว้นั้นง่ายมาก (ฉันเพิ่งรันสคริปต์แก้ไขและดูว่าการดำเนินการสำเร็จหรือไม่) แต่การทำอย่างนั้นกับ 100 โพรซีเดอร์นั้นค่อนข้างยุ่งยาก ฉันรู้ว่าฉันสามารถใช้สคริปต์เช่นนี้เพื่อรวบรวมวัตถุทั้งหมดของฐานข้อมูลของฉันได้ แต่การดำเนินการจริงจะเกิดขึ้นในครั้งต่อไปที่มีการเรียกใช้กระบวนงานที่เก็บไว้ไม่ใช่ทันทีดังนั้นจึงไม่เหมาะสมในกรณีของฉัน ฉันยังคิดว่าฉันสามารถลบโพรซีเดอร์ที่เก็บไว้ทั้งหมดและปรับฐานข้อมูลของฉันใหม่ด้วยระบบควบคุมแหล่งที่มาของฉัน แต่ตัวเลือกนั้นถึงแม้ว่าจะใช้งานได้จริง มีวิธีที่ดีกว่าในการทำเช่นนี้? ฉันใช้ SQLServer 2008 R2 และสคริปต์ฐานข้อมูลของฉันถูกเก็บไว้ในโครงการฐานข้อมูล VS 2008 เพื่อความกระจ่างแจ้งฉันไม่ได้ขอแนะนำให้ใช้วิธีทดสอบรหัสนี้เพียงอย่างเดียว เหมือนกับใน c # คุณตรวจพบข้อผิดพลาดทางไวยากรณ์ทันทีในไฟล์ที่ขึ้นต่อกันอื่น ๆ ในขณะที่คุณโค้ด (และจากนั้นใช้กลยุทธ์อื่น ๆ เพื่อทดสอบเช่นการทดสอบหน่วยซึ่งมักจะมีขนาดของคำสั่งช้าลง) ข้อผิดพลาดในไม่กี่วินาทีแทนที่จะต้องทำการทดสอบการทำงานเต็มรูปแบบซึ่งโดยทั่วไปอาจใช้เวลาสองสามชั่วโมงกว่าจะเสร็จสมบูรณ์

2
ประสิทธิภาพของทริกเกอร์ vs ขั้นตอนการจัดเก็บใน MySQL
โพสต์ที่นี่ใน DBA.StackExchange ( อะไรคือแนวทางปฏิบัติที่ดีที่สุดสำหรับทริกเกอร์เพื่อรักษาหมายเลขการแก้ไขเรคคอร์ด? ) ทำให้เกิดคำถามที่น่าสนใจ (อย่างน้อยก็น่าสนใจสำหรับฉัน) เกี่ยวกับประสิทธิภาพใน MySQL บริบทคือเราต้องการแทรกระเบียนในตารางสำหรับแต่ละแถวที่มีการปรับปรุง ก่อนที่จะอัปเดตแถวเราต้องการเก็บค่าก่อนหน้าจากนั้นเพิ่มหนึ่งในคอลัมน์ (คอลัมน์ "รุ่น") หากเราทำสิ่งนี้ภายในทริกเกอร์มันจะทำงานได้ดี สำหรับ MySQL ทริกเกอร์เป็นแบบทีละแถวดังนั้นมันจึงเป็นทางออกที่ง่าย เลือกข้อมูลในตารางปัจจุบันแทรกลงในตารางการบันทึกและอัปเดตคอลัมน์ "version" ในข้อมูลใหม่ อย่างไรก็ตามเป็นไปได้ที่จะย้ายตรรกะนี้ไปยังกระบวนงานที่เก็บไว้ หากคุณทำเช่นนั้นคุณกำลังทำการแทรกแล้วเพิ่มคอลัมน์ "รุ่น" ในตาราง สิ่งทั้งหมดจะถูกตั้งค่าตาม ดังนั้นเมื่อมันมาถึงการแทรกนี้นี้จะมีประสิทธิภาพมากกว่าที่จะใช้วิธีการจัดเก็บตามชุดหรือวิธีการตามทริกเกอร์? คำถามนี้มีไว้สำหรับ MySQL (เนื่องจากมีทริกเกอร์แบบทีละแถว) แม้ว่าจะสามารถนำไปใช้กับ DBMS ทริกเกอร์แบบแถวต่อแถวอื่น ๆ ได้

3
ใครเป็นผู้สร้างขั้นตอน (SQL Server 2008 R2)
มีวิธีในรายการที่สร้างการจัดหาใน SQL Server 2008 หรือไม่? ในลิงค์ SO นี้มีคำตอบบางส่วน แต่เมื่อ 6 ปีที่แล้ว ฉันรู้ว่าเป็นวิธีที่ดีที่สุดในการเขียนชื่อและวันที่ของคุณจากนั้นเริ่มสร้างขั้นตอน แต่ฉันไม่เห็นสิ่งนี้ที่ฉันทำงาน หากไม่มีวิธีในการทำเช่นนี้งานนี้จะถูกกระตุ้นด้วยทริกเกอร์หรือไม่? และคำถามโบนัส เป็นงานของ dba หรือไม่ รู้ว่าใครเป็นผู้สร้าง ขอบคุณมาก.

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.