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

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

2
กระทำจำเป็นหลังจากการดำเนินการ DML ในฟังก์ชั่น / ขั้นตอนหรือไม่?
ฉันสงสัยว่าถ้าจำเป็นต้องเขียนคอมมิทหลังจากใส่ / ลบ / อัพเดทในฟังก์ชั่น / ขั้นตอนหรือไม่ ตัวอย่าง: create or replace function test_fun return number is begin delete from a; return 0; end; หรือขั้นตอน create or replace procedure aud_clear_pro as begin delete from a; end; มันจำเป็นต้องกระทำหลังจากลบ? ไม่เข้าใจสถานการณ์ต่อไปนี้: ถ้าฉันเรียก function / procedure จากหน้าต่าง SQL มันต้องยอมรับ แต่ หากฉันกำหนดเวลาฟังก์ชั่น / ขั้นตอนโดยใช้ dbms_scheduler และเรียกใช้งานคำสั่งลบจะถูกส่งโดยอัตโนมัติ …

6
อย่าใช้ธุรกรรมสำหรับกระบวนงานที่เก็บไว้
ฉันมีขั้นตอนการจัดเก็บที่รันคำสั่งไม่กี่คำ ฉันไม่ต้องการให้ห่อคำสั่งเหล่านี้ในธุรกรรมของกระบวนงานที่เก็บไว้ หากคำสั่งที่ 4 ล้มเหลวฉันต้องการให้อันดับที่ 1, ที่ 2 และที่ 3 อยู่และไม่ย้อนกลับ เป็นไปได้ไหมที่จะเขียนโพรซีเดอร์ที่เก็บไว้ในลักษณะที่มันไม่ได้ดำเนินการทั้งหมดในการทำธุรกรรมครั้งใหญ่?

4
ฉันจะรู้ได้อย่างไรว่ามีกระบวนการหรือฟังก์ชั่นอยู่ในฐานข้อมูล mysql หรือไม่?
ฉันจะรู้ได้อย่างไรว่ามีกระบวนการหรือฟังก์ชั่นอยู่ในฐานข้อมูล MySQL หรือไม่? และมีตัวเลือกการค้นพบใด ๆ ชอบshow procedures;(เช่นชอบshow tables;)

2
ขั้นตอนการจัดเก็บกลางเพื่อดำเนินการในบริบทฐานข้อมูลการโทร
ฉันกำลังทำงานกับโซลูชันการบำรุงรักษาที่กำหนดเองโดยใช้sys.dm_db_index_physical_statsมุมมอง ฉันมีมันถูกอ้างอิงจากขั้นตอนการจัดเก็บ ตอนนี้เมื่อโพรซีเดอร์ที่เก็บรันบนหนึ่งในฐานข้อมูลของฉันมันทำสิ่งที่ฉันต้องการให้ทำและดึงรายการของระเบียนทั้งหมดที่เกี่ยวข้องกับฐานข้อมูลใด ๆ ลง เมื่อฉันวางไว้ในฐานข้อมูลอื่นมันจะดึงรายการทั้งหมดที่เกี่ยวข้องกับฐานข้อมูลนั้นลง ตัวอย่างเช่น (รหัสที่ด้านล่าง): การค้นหาทำงานกับฐานข้อมูล 6 แสดงข้อมูล [ร้องขอ] สำหรับฐานข้อมูล 1-10 เคียวรีรันกับฐานข้อมูล 3 แสดงข้อมูล [ร้องขอ] สำหรับฐานข้อมูล 3 เท่านั้น เหตุผลที่ฉันต้องการขั้นตอนนี้โดยเฉพาะในฐานข้อมูลสามเป็นเพราะฉันต้องการเก็บวัตถุการบำรุงรักษาทั้งหมดในฐานข้อมูลเดียวกัน ฉันต้องการให้งานนี้อยู่ในฐานข้อมูลการบำรุงรักษาและทำงานราวกับว่าอยู่ในฐานข้อมูลแอปพลิเคชันนั้น รหัส: ALTER PROCEDURE [dbo].[GetFragStats] @databaseName NVARCHAR(64) = NULL ,@tableName NVARCHAR(64) = NULL ,@indexID INT = NULL ,@partNumber INT = NULL ,@Mode NVARCHAR(64) = 'DETAILED' AS BEGIN SET …

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

4
เรียกกระบวนงานที่เก็บไว้จากทริกเกอร์
ฉันได้สร้างกระบวนงานที่เก็บไว้ใน mysql โดยใช้ไวยากรณ์ต่อไปนี้ DROP PROCEDURE IF EXISTS `sp-set_comment_count`; DELIMITER $$ CREATE PROCEDURE `sp_set-comment_count` (IN _id INT) BEGIN -- AC - AllCount DECLARE AC INT DEFAULT 0; SELECT COUNT(*) AS ac INTO AC FROM usergroups AS ug LEFT JOIN usergroup_comments AS ugm ON ugm.`gid` = ug.`id` LEFT JOIN mediagallery AS dm …

2
ปิดใช้งานการตรวจสอบ Schema On Function / Stored Procedure
ฉันพยายามทำให้กระบวนการที่ดำเนินการเปลี่ยนแปลงกับฐานข้อมูล SQL Server 2008 R2 เป็นไปโดยอัตโนมัติ กระบวนการที่ฉันวางไว้และสร้างโพรซีเดอร์และฟังก์ชันที่เก็บไว้ของฉันใหม่รวมถึงเรียกใช้สคริปต์เพื่อเปลี่ยนตาราง / คอลัมน์ / ข้อมูล น่าเสียดายที่สคริปต์ตัวใดตัวหนึ่งต้องใช้ฟังก์ชันใดฟังก์ชันหนึ่งก่อน แต่ฉันไม่สามารถเรียกใช้การเปลี่ยนแปลง proc / ฟังก์ชั่นที่เก็บไว้ได้ทั้งหมดเพราะมันอาศัยคอลัมน์ที่เพิ่มเข้ามาจากสคริปต์การเปลี่ยนแปลงตาราง / คอลัมน์ / ข้อมูลก่อน ฉันสงสัยว่าเป็นไปได้หรือไม่ที่จะเรียกใช้โพรซีเดอร์และฟังก์ชันที่เก็บไว้โดยไม่มี SQL Server ตรวจสอบคอลัมน์ที่ใช้ในการกำหนดฟังก์ชัน / SP? ฉันพยายามค้นหา แต่ไม่พบเงื่อนไขหรือคำสั่งเพื่อเปิดใช้งานสิ่งนี้

1
ASYNC_NETWORK_IO รอพิมพ์อะไรที่กังวลหรือไม่
ในการดูรายการของโพรซีเดอร์ที่เก็บไว้ซึ่งใช้เวลาในการประมวลผลนานจะมีความโดดเด่นที่ทำให้เกิดการรอคอยมากที่สุด อย่างไรก็ตามการรอนั้นส่วนใหญ่ (81%) เป็น ASYNC_NETWORK_IO และฉันรู้ว่าทำไม: กระบวนการที่เก็บไว้จะถ่ายโอนข้อมูลประมาณ 400 MB ในเอกสารอธิบายว่าสาเหตุของ ASYNC_NETWORK_IO คือไคลเอ็นต์ไม่สามารถตามกระแสข้อมูลได้และนั่นอาจเป็นจริง ฉันไม่แน่ใจว่าจะทำให้ลูกค้าติดตามได้อย่างไรเพราะมันคือการเรียกโพรซีเดอร์ที่เก็บไว้ผ่าน ADO.NET และเพียงแค่ประมวลผลชุดข้อมูล เมื่อได้รับข้อมูลนี้ฉันควรกังวลเกี่ยวกับประเภทรอ ASYNC_NETWORK_IO สำหรับกระบวนการนี้หรือไม่? จริง ๆ แล้วมันมีผลต่อประสิทธิภาพของเซิร์ฟเวอร์หรือไม่ ข้อมูลเพิ่มเติม: ฉันใช้ Service Pack 2 ของ SQL Server 2005 แอปไคลเอ็นต์อยู่ในกล่องเดียวกับ SQL Server (ฉันรู้ว่าฉันรู้ ... แต่ฉันไม่สามารถทำอะไรกับมันได้)

1
MySQL คืนค่าผลลัพธ์จากกระบวนงานที่เก็บไว้อย่างไร
ฉันพยายามทำให้ขั้นตอนการจัดเก็บเพื่อใช้ในเว็บแอปพลิเคชัน สำหรับผมแล้วดูเหมือนว่าคำสั่งสุดท้ายที่อยู่ในขั้นตอนการจัดเก็บของ MySQL จะเป็นสิ่งที่ได้รับการปฏิบัติตามชุดผลลัพธ์ของขั้นตอนนั้น น่าเสียดายที่ดูเหมือนว่ามีการอ้างอิงในเอกสาร MySQL ที่กล่าวว่ากระบวนการสามารถส่งคืนชุดผลลัพธ์ได้หลายชุด พฤติกรรมนี้ทำงานอย่างไร ฉันจะบอกเซิร์ฟเวอร์ MySQL ได้อย่างไรว่าฉันต้องการส่งคืนชุดผลลัพธ์เดียวเท่านั้น? (ตัวอย่างเช่นฉันมีข้อความค้นหาที่เลือกและแทรกไม่กี่ฉันไม่ต้องการบอกลูกค้าเกี่ยวกับส่วนแทรก แต่ฉันต้องการให้ลูกค้าได้รับชุดผลลัพธ์ของ SELECT .... )

1
คุณสั่งซื้อพารามิเตอร์อย่างไร
เพียงแค่สงสัยว่าฉันสามารถขอความคิดเห็นเกี่ยวกับขั้นตอนการจัดเก็บที่ฉันใช้อยู่หรือไม่และมีวิธีการจัดการสถานการณ์ที่มีประสิทธิภาพมากขึ้นหรือไม่ (ฉันค่อนข้างแน่ใจว่าจะมี!) โดยทั่วไปฉันมี SP เดียวที่ฉันเรียกเพื่อส่งกลับรายการของเรกคอร์ด (งาน) ที่อาจมีสถานะอย่างน้อยหนึ่งสถานะและเรียงลำดับ (ฉันใช้ RowNum สำหรับการเพจ) ในขณะที่ฉันกำลังใช้กับ RECOMPILE เพราะความหลากหลายของสถานะสามารถเปลี่ยนแปลงได้ตลอดเวลา (ขึ้นอยู่กับผู้ใช้ ฯลฯ ) นอกจากนี้ยังมีการกรองเกิดขึ้น ฉันใช้คำสั่ง IF เพื่อเรียกใช้บิตของรหัสเดียวกันโดยมีการเปลี่ยนแปลงเพียงอย่างเดียวคือการเรียงลำดับ ฉันเดาว่าคำถามของฉันคือ: มีวิธีที่ดีกว่าในการทำสิ่งนี้ (อาจเป็น SP ที่แตกต่างกันสำหรับสถานะที่แตกต่างกัน)? ฉันเข้าใจเรื่องนี้มากเกินไปเนื่องจากขาดความรู้ (น่าจะเป็น) SP จริงหรือไม่ แต่ต้องการปรับแต่งเล็กน้อยเพื่อลดจำนวนบรรทัด ฉันได้วางส่วนหนึ่งของ SP ด้านล่าง - ความแตกต่างเพียงอย่างเดียวกับรหัสเต็มคือคำสั่ง IF เพิ่มเติมสำหรับการเรียงลำดับที่แตกต่างกัน ... ฉันขอขอบคุณข้อเสนอแนะใด ๆ ขอบคุณล่วงหน้า! PROCEDURE [dbo].[sp_Jobs] @PageNumber int, @PageSize int, @FilterExpression varchar(500), @OrderBy …

3
วิธีการใช้งบเตรียมไว้ใน MySQL เก็บขั้นตอน?
ฉันกำลังใช้ mysql และฉันจำเป็นต้องใช้คอลัมน์ curid ที่ส่งคืนโดยคำสั่งที่เตรียมไว้ในแบบสอบถามภายหลัง ฉันใช้คำสั่งที่เตรียมไว้เพราะเมื่อฉันอ่านมันเป็นวิธีเดียวที่จะส่งผ่านตัวแปรไปยังส่วนคำสั่ง LIMIT ฉันมีขั้นตอนการจัดเก็บที่นี่: DROP PROCEDURE IF EXISTS fixbalance; CREATE PROCEDURE fixbalance (userid INT) BEGIN DECLARE i INT DEFAULT 0; DECLARE balance INT DEFAULT 0; DECLARE idcnt INT; SET idcnt = (SELECT COALESCE(COUNT(id), 0) FROM coupon_operations WHERE user_id = userid); IF idcnt <> 0 THEN WHILE …

1
มีทางเลือก "สร้างหรือแทนที่ขั้นตอน" ใน MySQL หรือไม่
มีรุ่น "สร้างหรือแทนที่โพรซีเดอร์" สำหรับ MySQL หรือไม่ ฉันไม่สามารถทำเช่นนี้หรือสคริปต์การวางขั้นตอนหากมีอยู่ก่อนที่จะคอมไพล์ใหม่โดยไม่ได้รับข้อความแสดงข้อผิดพลาดว่ามีขั้นตอนการจัดเก็บอยู่ DELIMITER $$ -- would love to be able to drop procedure if exists db.sp_tmp_90days; -- or use "create or replace" create procedure db.sp_tmp_90days() BEGIN drop table db.tmp_90days; create table db.tmp_90days ( user_name varchar(128), first_name varchar(50), last_name varchar(50), system varchar(10), last_login datetime ); alter table …

1
การตั้งค่าการอนุญาตของผู้ใช้สำหรับสคีมา SQL Server ต่างๆ
ฉันจำเป็นต้อง จำกัด การเข้าถึงผู้ใช้เฉพาะ แต่พวกเขายังต้องสามารถดูข้อมูลในตารางที่ dbo เป็นเจ้าของได้ ฉันกำลังพยายามทำสิ่งต่อไปนี้: ฟังก์ชั่น dbo schema ตามปกติจะสามารถเข้าถึงทุกสิ่ง schema1 schema มีการเข้าถึงวัตถุ schema1 เท่านั้น ถ้ามุมมอง schema1 หรือกระบวนงานที่เก็บไว้เข้าถึงข้อมูลในตารางที่ dbo เป็นเจ้าของห่วงโซ่การอนุญาตอย่างเหมาะสม user1 มีสิทธิ์เข้าถึง schema1 และไม่มีอะไรอื่นอีก ยกเว้นในกรณีของ # 3 นี่คือสิ่งที่ฉันได้ลอง: สร้างผู้ใช้ user1 ที่แมปกับการเข้าสู่ระบบทดสอบด้วยรหัสผ่านแบบสุ่ม สร้างตารางคู่ใน dbo schema ด้วยข้อมูลการทดสอบบางอย่าง สร้างสคีมา 1 สร้าง schema1.get_profiles ที่เลือกจากมุมมองที่เรียกว่า schema1.profiles ซึ่งเข้าถึงข้อมูลใน dbo.people, dbo.taglinks และ dbo.tags อย่างไรก็ตามการใช้คำสั่งต่อไปนี้ในขณะที่เข้าสู่ระบบในฐานะผู้ใช้ 1: EXEC …

7
ขั้นตอนการจัดเก็บภายใต้การควบคุมแหล่งที่มาแนวปฏิบัติที่ดีที่สุด
ฉันกำลังใช้ Tortoise SVN เพื่อควบคุมแหล่งโปรแกรมประยุกต์บนเว็บ NET อะไรจะเป็นวิธีที่ดีที่สุดในการนำ SQL Server ของเรามาใช้ในการควบคุมกระบวนการ ขณะนี้ฉันใช้ VS 2010 เป็นสภาพแวดล้อมการพัฒนาของฉันและเชื่อมต่อกับฐานข้อมูล SQL Server 2008 R2 นอกสถานที่โดยใช้ SQL Server Data Tools (SSDT) สิ่งที่ฉันทำในอดีตคือการบันทึก procs เป็นไฟล์. sql และทำให้ไฟล์นี้อยู่ภายใต้การควบคุมของแหล่งที่มา ฉันแน่ใจว่าต้องมีวิธีที่มีประสิทธิภาพมากกว่านี้หรือไม่ มีส่วนขยายที่ฉันสามารถติดตั้งบน VS2010, SSDT หรือแม้แต่ SQL Server บนเครื่องที่ใช้งานจริงได้หรือไม่?

2
การเพิ่มประสิทธิภาพ: การย้ายการประกาศตัวแปรไปยังด้านบนของกระบวนการของคุณ
ในขณะที่ทำงานเกี่ยวกับการเพิ่มประสิทธิภาพของโพรซีเดอร์ที่เก็บไว้บางอย่างฉันก็นั่งลงกับ DBA และผ่านขั้นตอนที่เก็บไว้บางอย่างที่มีการบล็อกสูงและ / หรือกิจกรรมการอ่าน / เขียนสูง สิ่งหนึ่งที่ DBA กล่าวถึงคือฉันควรประกาศตัวแปรทั้งหมด (โดยเฉพาะอย่างยิ่งตัวแปรTABLEที่ด้านบนสุดของโพรซีเดอร์ที่เก็บไว้เพื่อหลีกเลี่ยงการคอมไพล์ซ้ำ นี่เป็นครั้งแรกที่ฉันเคยได้ยินเรื่องนี้และกำลังมองหาการยืนยันบางอย่างก่อนที่จะกลับไปสู่ขั้นตอนการจัดเก็บที่แตกต่างกันทั้งหมดที่เรามี เขาเรียกมันว่า "การดูรหัสล่าช้า" และการคอมไพล์ใหม่กำลังล็อคสคีมาซึ่งจะอธิบายการบล็อก การย้ายการประกาศตัวแปรทั้งหมดไปยังด้านบนของโพรซีเดอร์ที่เก็บไว้ของคุณจะลดการคอมไพล์ใหม่หรือไม่?

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