หมายเหตุ
การเข้าถึงหน้านี้ต้องได้รับการอนุญาต คุณสามารถลอง ลงชื่อเข้าใช้หรือเปลี่ยนไดเรกทอรีได้
การเข้าถึงหน้านี้ต้องได้รับการอนุญาต คุณสามารถลองเปลี่ยนไดเรกทอรีได้
นําไปใช้กับ: ✅ คลังสินค้าใน Microsoft Fabric
บทความนี้รวมถึงหัวข้อการแก้ไขปัญหาสําหรับการพัฒนาและปรับใช้ Fabric คลังข้อมูล ที่มีการผสานรวม Git ในตัวของ Fabric
Important
คุณลักษณะนี้อยู่ในตัวอย่าง
อ้างอิงถึงวัตถุของคลังสินค้าโดยใช้ชื่อสามส่วน
วัตถุสามารถอ้างอิงวัตถุอื่น ในคลังเดียวกัน โดยใช้ชื่อ [warehouse_name].[schema_name].[object_name]สามส่วน
การตั้งชื่อสามส่วนมีจุดประสงค์เพื่ออ้างอิงคลังสินค้าที่แตกต่างกัน เมื่อส่วนฐานข้อมูลตั้งชื่อคลังข้อมูลปัจจุบัน การสร้างจะถือว่าการอ้างอิงนั้นเป็นภายนอก และอ็อบเจ็กต์จะถูกกําหนดสองครั้งในโมเดล
ลบส่วนฐานข้อมูลออกจากการอ้างอิงไปยังวัตถุของคลังสินค้าเอง:
-- Fails: the warehouse is named MyWarehouse and references itself by name
CREATE VIEW [Sales].[CustomerSummary] AS
SELECT c.[CustomerId], c.[OrderDate]
FROM [MyWarehouse].[Sales].[Customers] AS c;
-- Works
CREATE VIEW [Sales].[CustomerSummary] AS
SELECT c.[CustomerId], c.[OrderDate]
FROM [Sales].[Customers] AS c;
เฉพาะการอ้างอิงถึงวัตถุของคลังสินค้าเองเท่านั้นที่ต้องเปลี่ยนแปลง การอ้างอิงข้ามฐานข้อมูลที่แท้จริงไปยังคลังสินค้าอื่น ๆ เช่น [Other_Warehouse].[Sales].[Orders], ได้รับการสนับสนุนและควร as-isไว้
Important
ใช้การตั้งชื่อแบบสามส่วน (database.schema.object) เฉพาะสําหรับการอ้างอิงปลายทางวิเคราะห์ข้ามคลังสินค้าหรือข้าม SQL เท่านั้น ไม่ใช้อ้างอิงวัตถุภายในคลังเดียวกัน การอ้างอิงตัวเองในคลังเดียวกันโดยใช้การตั้งชื่อสามส่วนไม่ใช่วิธีสร้างแบบจําลองมาตรฐาน และอาจสร้างการอ้างอิงภายนอกโดยไม่ตั้งใจ
หากเป็นไปได้ ให้จําลองวัตถุโดยใช้การตั้งชื่อแบบสองส่วน (schema.object) แทนการตั้งชื่อแบบสามส่วน แม้แต่สําหรับการอ้างอิงตัวเองภายในคลังเดียวกัน ข้อตกลงนี้ช่วยเพิ่มความสอดคล้องระหว่างเครื่องมือไคลเอนต์และหลีกเลี่ยงความคลุมเครือที่เกิดจากการอ้างอิงสามส่วน
ไฟล์ .sqlproj ที่ล้าสมัยในคลัง Git
ที่เก็บข้อมูล Git อาจมี.sqlprojไฟล์ที่อ้างอิงถึงเวอร์ชัน SDK เก่าMicrosoft.Build.Sql SDK รุ่นเก่าไม่รู้จักไวยากรณ์ Fabric คลังข้อมูล ใหม่ๆ เช่น IDENTITY คอลัมน์และCLUSTER BY
ปัญหานี้ส่งผลกระทบต่อที่เก็บข้อมูลที่เนื้อหาถูกผูกมัดก่อนที่คลังเก็บจะเปลี่ยนไปใช้รูปแบบคําจํากัดความปัจจุบัน สถานการณ์ที่พบบ่อยที่สุดที่ทําให้ไฟล์ .sqlproj ล้าสมัย ได้แก่:
- การเชื่อมต่อพื้นที่ทํางานใหม่กับที่เก็บข้อมูลที่มีอยู่ คลังสินค้าถูกสร้างขึ้นจากสิ่งที่ถูกผูกมัดไว้ที่นั่น
- การขยายไปยังพื้นที่ทํางานใหม่
- กําลังกู้คืนคลังข้อมูลที่ถูกลบจาก Git
- ซิงค์จาก Git ทันทีหลังจากที่คลังข้อมูลย้ายไปยังรูปแบบนิยามปัจจุบัน ก่อนที่จะมีการซิงค์ในทิศทางตรงข้าม
คลังสินค้าที่ไม่ได้ย้ายไปยังรูปแบบนิยามปัจจุบันจะไม่ได้รับผลกระทบ เพราะไฟล์โปรเจกต์เก่าไม่ได้ถูกใช้ในการสร้าง
วิธียืนยันเวอร์ชัน .sqlproj SDK
เปิดไฟล์คลังข้อมูล .sqlproj ในที่เก็บข้อมูลและตรวจสอบเวอร์ชัน SDK ใน XML:
<Sdk Name="Microsoft.Build.Sql" Version="2.2.0" />
เวอร์ชันที่ล้าหลัง Microsoft ปัจจุบัน เวอร์ชันแพ็กเกจ Build.Sql หมายถึงไฟล์โปรเจกต์ที่ล้าสมัย ตัวอย่างเช่น หากเวอร์ชันของคุณขึ้นต้นด้วย 0.1.. สําหรับข้อมูลเพิ่มเติม โปรดดูที่ Microsoft Build.SQL และ Templates Releases
ตัวเลือกเวอร์ชันอัปเดต .sqlproj SDK A: ซิงค์คลังข้อมูลไปยัง Git ก่อน
ถ้าคลังข้อมูลมีอยู่ใน workspace แล้วและยังสมบูรณ์ ให้ commit จาก workspace ไปยัง Git ก่อนซิงค์ไปอีกทางหนึ่ง การดําเนินการนี้จะสร้างไฟล์โปรเจกต์ใหม่ด้วยเวอร์ชัน SDK ปัจจุบัน หลังจากนั้นการซิงค์จาก Git จะทํางานได้ตามปกติ
ตัวเลือกนี้เป็นที่นิยมหากมี เพราะจะทําให้คํานิยามทั้งหมดทันสมัยขึ้น ไม่ใช่แค่แอตทริบิวต์ SDK เท่านั้น
คลังสินค้าต้องอยู่ในรูปแบบคําจํากัดความปัจจุบันอยู่แล้วเพื่อให้ตัวเลือกนี้ทํางานได้ ถ้าไม่เป็น ให้อัปเกรดก่อนในแผง Fabric Git แล้วค่อยตัดสินใจใช้ Git การ commit จากคลังข้อมูลที่ยังใช้รูปแบบ definition เก่าจะเขียนไฟล์เก่ากลับไปยัง repository และไม่รีเฟรชเวอร์ชัน SDK ดังนั้นการซิงค์ครั้งถัดไปจึงล้มเหลวในลักษณะเดียวกัน ถ้าอัปเกรดไม่ได้ ให้ใช้ วิธีแก้ไข B แทน
ตัวเลือก B อัปเดตเวอร์ชัน .sqlproj SDK: อัปเดตไฟล์ .sqlproj ใน Git โดยตรง
ใช้ตัวเลือกนี้เมื่อคลังสินค้ายังไม่มีอยู่ในพื้นที่ทํางานเป้าหมาย เช่น เมื่อคุณกําลังเชื่อมต่อพื้นที่ทํางานใหม่กับที่เก็บข้อมูลที่มีอยู่ การขยายสาขา หรือการกู้คืนคลังสินค้าที่ถูกลบ ในกรณีเหล่านั้น จะไม่มีคลังสินค้าให้ซิงค์ ดังนั้นตัวเลือกแก้ไข A จึงไม่สามารถใช้งานได้
แก้ไข.sqlprojไฟล์ในที่เก็บข้อมูลเพื่อใช้ Microsoft เวอร์ชันล่าสุด เวอร์ชันแพ็กเกจ build.sql และคอมมิตการเปลี่ยนแปลง ตัวอย่างเช่น:
<!-- Before -->
<Sdk Name="Microsoft.Build.Sql" Version="0.1.19-preview" />
<!-- After -->
<Sdk Name="Microsoft.Build.Sql" Version="2.2.0" />
การส่งออกหรือดิฟฟิฟต์เพียงอย่างเดียวจะไม่อัปเดตไฟล์โปรเจกต์ ไฟล์จะถูกเขียนใหม่ก็ต่อเมื่อการ commit จาก workspace ไปยัง Git เสร็จสมบูรณ์ หรือเมื่อคุณแก้ไขด้วยตนเอง
คอลัมน์ที่ไม่ผ่านคุณสมบัติในวัตถุที่อ้างอิงสองตารางขึ้นไปในคลังสินค้าอื่น
ควรให้และใช้ชื่อแทนตารางเสมอเมื่ออ้างอิงคอลัมน์ในคําสั่ง T-SQL
- เมื่อคําสั่ง T-SQL อ้างอิงสองตารางขึ้นไปในคลังข้อมูลอื่น build จะไม่สามารถตรวจสอบความถูกต้องของคอลัมน์ที่เขียนโดยไม่มีชื่อแทนตารางไปยังตารางเฉพาะได้ ตารางไม่จําเป็นต้องมีชื่อคอลัมน์ร่วมกันเพื่อให้เกิดความคลุมเครือนี้ ความคลุมเครือนี้มีอยู่ในบิลด์การตรวจสอบ
- ความคลุมเครือนี้ส่งผลต่อคําสั่ง T-SQL ภายในวัตถุที่อ้างอิงตารางสองตารางขึ้นไปในคลังข้อมูลอื่นภายในเนื้อหาคําสั่งเดียวกัน
- ความคลุมเครือนี้ไม่ส่งผลต่อคําสั่ง T-SQL ภายในวัตถุที่อ้างอิงเพียงตารางเดียวในคลังข้อมูลอื่น เพราะถ้ามีซอร์สเดียวก็ไม่มีอะไรให้คลุมเครือระหว่างกัน
- ความคลุมเครือนี้ไม่ส่งผลต่อคําสั่ง T-SQL ที่อยู่ภายในคลังข้อมูลเดียวทั้งหมด
ในตัวอย่างต่อไปนี้ มีfieldinfoเพียง finame , ดังนั้น SQL จึงถูกต้องและรันได้ถูกต้องกับคลังข้อมูล แต่มีความคลุมเครือในบิลด์การตรวจสอบ
-- Fails: two tables from another warehouse, and 'finame' isn't alias-qualified
CREATE PROCEDURE [dbo].[LoadFieldInfo] AS
SELECT finame
FROM [OtherWarehouse].[halo].[fieldinfo] AS f
INNER JOIN [OtherWarehouse].[halo].[lookup] AS l ON f.[id] = l.[id];
เพิ่มชื่อแทนตารางให้กับทุกการอ้างอิงคอลัมน์ในวัตถุที่ได้รับผลกระทบ:
-- Works: every column carries its table alias
CREATE PROCEDURE [dbo].[LoadFieldInfo] AS
SELECT f.[finame]
FROM [OtherWarehouse].[halo].[fieldinfo] AS f
INNER JOIN [OtherWarehouse].[halo].[lookup] AS l ON f.[id] = l.[id];
การใช้ตัวพิมพ์ใหญ่ของชื่อสคีมาไม่สอดคล้องกัน
คลังสินค้าของคุณสามารถใช้การจัดเรียงแบบไม่แยกตัวพิมพ์เล็ก-ใหญ่ ดังนั้น sales และ Sales เป็นสคีมาเดียวกัน แต่สคริปต์ของคุณอาจสะกดทั้งสองแบบในหลายจุด ฐานข้อมูลที่ไม่สนใจตัวพิมพ์เล็ก-ใหญ่มักจะยอมรับเรื่องนี้เสมอ ดังนั้นความไม่สอดคล้องจึงมักมีมานานและไม่เป็นอันตราย
เมื่อสคริปต์ของคุณอ้างอิงถึงวัตถุสองชิ้นขึ้นไปในสคีมาเดียวกันของคลังสินค้าอื่น และสะกดสคีมานั้นแตกต่างกันในแต่ละการอ้างอิง การสร้างจะสร้าง CREATE SCHEMA คําสั่งสําหรับแต่ละการสะกดคํา ปัญหานี้จะเกิดขึ้นเฉพาะกับคลังสินค้าที่อ้างอิงคลังสินค้าอื่นและใช้การจัดเรียงแบบไม่แยกแยะตัวพิมพ์เล็ก-ใหญ่
- โดยค่าเริ่มต้น คลังสินค้าใน Fabric จะใช้
Latin1_General_100_BIN2_UTF8, การจัดเรียงแบบแยกตัวพิมพ์ใหญ่-เล็ก คลังสินค้าที่แยกแยะตัวพิมพ์ใหญ่ไม่ได้รับผลกระทบ ในคลังสินค้าsalesเหล่านั้น และSalesSchema คือสองรูปแบบที่แตกต่างกัน ไม่ว่าคุณจะตั้งใจหรือไม่ก็ตาม - ฐานข้อมูลที่ไม่สนใจตัวพิมพ์เล็ก-เล็กไม่สามารถมีทั้ง
salesและSalesการซ้ํากันเกิดจากการสะกดคําที่แตกต่างกันในข้อความ SQL ของคุณเท่านั้น
ตรวจสอบการจัด เรียงคลังสินค้า และข้อมูล ModelCollation ที่ระบุใน .sqlproj ไฟล์ ค้นหา CI (ไม่สนใจตัวพิมพ์ใหญ่-เล็ก) หรือ CS (ไม่สนใจตัวพิมพ์ใหญ่-เล็ก)
<ModelCollation>1033, CI</ModelCollation> <!-- case-insensitive: affected -->
<ModelCollation>1033, CS</ModelCollation> <!-- case-sensitive: not affected -->
Fix
เพื่อระบุการพิมพ์ใหญ่ชื่อสคีมาในนิยามอ็อบเจ็กต์คลังสินค้าของคุณ ให้เปรียบเทียบการพิมพ์ใหญ่ของสคีมาที่ระบุในข้อผิดพลาดในทุกสคริปต์ของคุณ มองหาการอ้างอิงข้ามคลังสินค้าสองรายการที่อ้างอิงโครงสร้างเดียวกันซึ่งแตกต่างกันเฉพาะในกรณีที่มี
ใช้ตัวพิมพ์ใหญ่เดียวที่สอดคล้องกันทุกที่ โดยตรงกับชื่อสคีมาจริงในคลังข้อมูลที่อ้างอิง ตัวอย่างเช่น ใช้ only Sales หรือ only sales.
-- Fails: two objects in the same schema, referenced with different capitalization
CREATE VIEW [dbo].[v_one] AS SELECT * FROM [OtherWarehouse].[sales].[Orders];
GO
CREATE VIEW [dbo].[v_two] AS SELECT * FROM [OtherWarehouse].[Sales].[Customers];
-- Works: same capitalization in both references
CREATE VIEW [dbo].[v_one] AS SELECT * FROM [OtherWarehouse].[Sales].[Orders];
GO
CREATE VIEW [dbo].[v_two] AS SELECT * FROM [OtherWarehouse].[Sales].[Customers];
คุณจะเจอปัญหานี้เมื่อคุณมีวัตถุสองตัวที่แตกต่างกันโดยใช้ตัวพิมพ์ใหญ่ในสคีมาสองแบบ การอ้างอิงถึงวัตถุ เดียวกัน สองครั้งที่มีตัวพิมพ์ใหญ่ต่างกันจะถูกพับให้ถูกต้องและไม่ล้มเหลว
การจัดเรียงคอลัมน์
หาก clause ของCOLLATEคอลัมน์ระบุ collation เดียวกับ collation เริ่มต้นของ warehouse การสกัด schema ของ Fabric (ที่ใช้ DacFx) จะถือว่า collation แบบชัดเจนนั้นเท่ากับไม่ระบุเลย ในกรณีนี้:
- clause explicit
COLLATEจะไม่ปรากฏในคํานิยามรายการที่ดึงออกจาก Git repository - คอลัมน์นี้จะไม่แสดงเป็นความแตกต่างใน Git Changes, Updates หรือการเปรียบเทียบ deployment pipeline เพราะไม่มีความแตกต่างที่มีประสิทธิภาพจากการรวบรวมข้อมูลเริ่มต้นของ warehouse
เฉพาะคอลัมน์ที่การจัดเรียงแตกต่างจากการจัดเรียงเริ่มต้นของคลังเก็บเท่านั้นที่จะ COLLATE ยังคงมี clause ชัดเจนในซอร์สคอนโทรล และการเปลี่ยนแปลงการจัดเรียงของคอลัมน์นั้นจะปรากฏเป็นความแตกต่างเท่านั้น
ตัวอย่างเช่น พิจารณาคลังสินค้าที่มีการจัดเรียงเป็น Latin1_General_100_CI_AS_KS_WS_SC_UTF8:
CREATE TABLE dbo.MixedCollationExample
(
CustomerId INT NOT NULL,
FirstName VARCHAR(100) NOT NULL, -- inherits warehouse collation
LastNameBin VARCHAR(100) COLLATE Latin1_General_100_BIN2_UTF8 NOT NULL, -- column override, differs from warehouse collation
Email VARCHAR(256) COLLATE Latin1_General_100_CI_AS_KS_WS_SC_UTF8 NULL -- explicit collation, matches warehouse collation
);
-
FirstNameไม่มีการจัดเรียงแบบชัดเจนและสืบทอดการจัดเรียงเริ่มต้นของคลังข้อมูล -
LastNameBinมีการเรียงลําดับแบบชัดเจนที่แตกต่างจากการเรียงลําดับเริ่มต้นของคลังสินค้า ดังนั้นจึงถูกเก็บไว้ในคํานิยามที่ดึงออกมาและจะแสดงเสมอในการเปรียบเทียบหากมีการเปลี่ยนแปลง -
Emailมีการเรียงลําดับแบบชัดเจนที่ตรงกับการรวบรวมเริ่มต้นของคลังสินค้า แม้ว่า clause จะมีCOLLATEใน T-SQL แต่จะไม่ปรากฏในคําจํากัดความที่ Git ดึงออกมา หรือในการเปรียบเทียบ Git หรือ deployment pipeline เพราะมันเทียบเท่ากับค่าเริ่มต้น
ข้อผิดพลาดคอลัมน์ที่คลุมเครือเมื่อมีวัตถุผู้สมัครซ้ํากัน
การคอมมิตหรืออัปเดตจาก Git อาจล้มเหลวหากเกิดข้อผิดพลาดคอลัมน์ที่คลุมเครือซึ่งรายการผู้สมัครมี :: ตัวคั่น เช่น:
SQL71501: View: [dbo].[SchoolSummary] contains an unresolved reference to an object.
Either the object does not exist or the reference is ambiguous because it could refer
to any of the following objects: [dbo].[SchoolSummary].[NCESID] or
[dbo].[SchoolSummary].[ss]::[NCESID].
::ตัวคั่นนี้แยกความแตกต่างนี้ออกจากความกํากวมที่แท้จริงที่อธิบายไว้ในคอลัมน์ Unqualified ในวัตถุที่อ้างอิงตารางสองตารางขึ้นไปในคลังสินค้าอื่น การเพิ่มนามแฝงในตารางไม่สามารถแก้ไขได้ เพราะนามแฝงจะปรากฏในรายการผู้สมัครและข้อผิดพลาดยังคงเกิดขึ้น
อันดับแรก ตัดสาเหตุที่พบบ่อยสองประการนี้ออกไป:
- วัตถุที่หายไปจริง ๆ หรือถูกตั้งชื่อผิด ถ้าคอมมิตหรืออัปเดตเดียวกันยังรายงานการอ้างอิงที่ยังไม่ได้แก้ไขไปยังวัตถุที่หายไปเฉพาะ เช่น
SQL71501: View: [dbo].[v_report] has an unresolved reference to object [dbo].[MissingTable]ให้แก้ไขการอ้างอิงนั้นก่อน::ผู้สมัครมักจะผ่านไปพร้อมกับมัน - คอลัมน์ที่คลุมเครือจริง ๆ หากเลือกคอลัมน์ที่ไม่มีคุณสมบัติบนการรวมของแหล่งข้อมูลสองแหล่งที่ทั้งสองเปิดเผยคอลัมน์ที่มีชื่อเดียวกัน ให้ระบุคอลัมน์นั้นด้วยชื่อเล่นในตาราง เช่น
a.[NCESID]. SQL Server ก็จะปฏิเสธคําถามนี้เช่นกัน ดังนั้นมันไม่ได้จํากัดเฉพาะการเชื่อมต่อกับ Git
- วัตถุที่หายไปจริง ๆ หรือถูกตั้งชื่อผิด ถ้าคอมมิตหรืออัปเดตเดียวกันยังรายงานการอ้างอิงที่ยังไม่ได้แก้ไขไปยังวัตถุที่หายไปเฉพาะ เช่น
ถ้าอ็อบเจ็กต์ที่อ้างอิงทุกชิ้นมีอยู่จริงและไม่มีคอลัมน์ใดที่คลุมเครือจริง ๆ ผู้สมัครจะเป็น
::ปัญหาที่ทราบกันดีในการตรวจสอบความถูกต้องที่เกิดขึ้นระหว่างการคอมมิตและอัปเดตจาก Git ซึ่งทีมผลิตภัณฑ์ติดตามอยู่ ลองวิธีแก้ไขเหล่านี้ตามลําดับ:- แทนที่
SELECT *CTE ภายในและตารางที่สร้างขึ้นด้วยรายการคอลัมน์ที่ชัดเจน - แบ่งมุมมองเพื่อให้แต่ละแหล่งที่มาที่คลุมเครือถูกกําหนดในมุมมองของตัวเอง และอ้างอิงมุมมองนั้นแทนที่จะทําซ้ําคําค้นพื้นฐาน
- หลีกเลี่ยงการเชื่อมต่อกับ
OPENROWSET(BULK ...)แหล่งที่มีรูปร่างแบบไดนามิกอื่นในคําสั่งเดียวกัน
- แทนที่
หากไม่มีวิธีใดแก้ไขข้อผิดพลาดได้ ให้รวบรวมคํานิยามของวัตถุที่ระบุในข้อผิดพลาดและเปิดคําขอสนับสนุน สําหรับข้อจํากัดเฉพาะของสายงานการปรับใช้ โปรดดูที่ ข้อจํากัด