มีวิธีระบุหรือไม่ว่าเมื่อเรียกใช้สคริปต์ sql มันจะหยุดเมื่อพบข้อผิดพลาดแรกบนสคริปต์โดยปกติจะดำเนินต่อไปโดยไม่คำนึงถึงข้อผิดพลาดก่อนหน้านี้
มีวิธีระบุหรือไม่ว่าเมื่อเรียกใช้สคริปต์ sql มันจะหยุดเมื่อพบข้อผิดพลาดแรกบนสคริปต์โดยปกติจะดำเนินต่อไปโดยไม่คำนึงถึงข้อผิดพลาดก่อนหน้านี้
คำตอบ:
ฉันคิดว่าวิธีการเพิ่มการติดตามใน. psqlrc ยังห่างไกลจากความสมบูรณ์แบบ
\set ON_ERROR_STOP on
มีวิธีที่ง่ายและสะดวกกว่ามาก - ใช้ psql กับพารามิเตอร์:
psql -v ON_ERROR_STOP=1
ดีกว่าที่จะใช้-X
พารามิเตอร์ปิดการใช้งานไฟล์. psqlrc ทำงานได้ดีสำหรับฉัน
ps วิธีแก้ปัญหาที่พบในโพสต์ที่ยอดเยี่ยมจาก Peter Eisentraut ขอบคุณปีเตอร์! http://petereisentraut.blogspot.com/2010/03/running-sql-scripts-with-psql.html
ฉันคิดว่าคุณกำลังใช้psql
สิ่งนี้อาจเป็นประโยชน์ในการเพิ่มลงใน~/.psqlrc
ไฟล์ของคุณ
\set ON_ERROR_STOP on
ซึ่งจะทำให้ล้มเลิกข้อผิดพลาดแรก หากคุณไม่มีแม้ว่าจะมีธุรกรรมก็จะยังคงเรียกใช้สคริปต์ของคุณ แต่ล้มเหลวในทุกอย่างจนกว่าจะสิ้นสุดสคริปต์ของคุณ
และคุณอาจต้องการใช้ธุรกรรมตามที่ Paul กล่าว ซึ่งสามารถทำได้psql --single-transaction ...
หากคุณไม่ต้องการแก้ไขสคริปต์
ตัวอย่างที่สมบูรณ์โดยมี ON_ERROR_STOP ใน. psqlrc ของคุณ:
psql --single-transaction --file /your/script.sql
--single-transaction
จะใช้แล้ว -v ON_ERROR_STOP=1
ก็ยังจำเป็นสำหรับสถานะที่ไม่มีอยู่
ไม่ใช่สิ่งที่คุณต้องการ แต่ถ้าคุณเริ่มต้นสคริปต์ของคุณbegin transaction;
และลงท้ายด้วยend transaction;
จริง ๆ แล้วมันจะข้ามทุกอย่างหลังจากเกิดข้อผิดพลาดครั้งแรกจากนั้นมันจะย้อนกลับทุกสิ่งที่ทำก่อนเกิดข้อผิดพลาด
ฉันมักจะอ้างอิงคู่มือโดยตรง
จากคู่มือ PostgreSQL :
ออกจากสถานะ
psql จะส่งคืน 0 ไปยังเชลล์หากเสร็จสิ้นตามปกติ 1 หากเกิดข้อผิดพลาดร้ายแรงของตัวมันเอง (เช่นหน่วยความจำไม่พบไฟล์) 2 หากการเชื่อมต่อกับเซิร์ฟเวอร์เสียและเซสชันไม่โต้ตอบและ 3 ถ้า เกิดข้อผิดพลาดในสคริปต์และมีการตั้งค่าตัวแปร ON_ERROR_STOP
ตามค่าเริ่มต้นถ้ารหัส sql ที่คุณกำลังเรียกใช้บนข้อผิดพลาดของเซิร์ฟเวอร์ PostgreSQL psql จะไม่ออกจากข้อผิดพลาด มันจะจับข้อผิดพลาดและดำเนินการต่อ หากดังที่กล่าวไว้ข้างต้นคุณตั้งค่าการON_ERROR_STOP
ตั้งค่าเป็นเปิดเมื่อ psql ตรวจพบข้อผิดพลาดในโค้ด sql มันจะออกและกลับ3
ไปที่เชลล์
-v ON_ERROR_STOP=ON
ยังใช้งานได้อย่างน้อยด้วย 9.2 ฉันสงสัยว่ามีการอนุญาตให้ใช้บูลีน "จริง"ในรูปแบบต่างๆ