ผู้ดูแลฐานข้อมูล

ถามตอบสำหรับผู้เชี่ยวชาญด้านฐานข้อมูลที่ต้องการพัฒนาทักษะฐานข้อมูลและเรียนรู้จากผู้อื่นในชุมชน

4
วิธีการยกเว้นค่า NULL ภายใน CONCAT MySQL
หากฉันมีสิ่งนี้ - tadd คือAddressตาราง: CONCAT(tadd.street_number, ' ', tadd.street_name,', ', tadd.apt_number,', ', tadd.city,', ', tadd.postal_code,', ', tadd.country) AS 'Address' มีวิธียกเว้น apt_number หรือไม่หากไม่มีอยู่? ฉันคิดว่า: WHERE tadd.apt_number IS NOT NULL แต่มันจะคืนค่าเฉพาะแถวเหล่านั้นด้วยapt_numberและแม้ว่าบางสิ่งจะทำงานฉันจะจัดการกับเครื่องหมายจุลภาคพิเศษนั้นได้อย่างไร หากเป็นรายการซ้ำโปรดโพสต์ลิงก์ในความคิดเห็น
15 mysql  null  concat 

1
วิธีการโอนความเป็นเจ้าของ dbo schema ใน SQL Server 2012
ฉันได้ให้สิทธิ์การเป็นเจ้าของ schema db_owner แก่ผู้ใช้โดยไม่ได้ตั้งใจ (โดยใช้ช่องทำเครื่องหมายใน UI ด้านล่าง) และตอนนี้ฉันไม่สามารถ: โอนสิทธิ์การเป็นเจ้าของให้กับผู้ใช้รายอื่น ดร็อปผู้ใช้จาก DB (แม้ว่าฉันสามารถลบล็อกอินใน SQL Server) ฉันลองหลักการฐานข้อมูลเป็นเจ้าของสคีมาในฐานข้อมูลและไม่สามารถลบได้ ALTER AUTHORIZATION ON SCHEMA::db_owner TO dbo และในขณะที่เสร็จสมบูรณ์ผู้ใช้ยังคงเป็นเจ้าของและเป็นสีเทาดังนั้นฉันจึงไม่สามารถทำได้ใน UI เช่นกัน พบวิธีแก้ปัญหา: นอกเหนือจากคำตอบของ Arronฉันรู้ว่าฉันเรียกใช้คำสั่งข้างต้นในฐานข้อมูลผิด (facepalm!) เมื่อ DB ได้รับการแก้ไขทั้ง SQL ข้างต้นและคำตอบด้านล่างทำงาน

5
มันสมเหตุสมผลไหมที่จะใช้เครื่องหมายวงเล็บของ SQL Server ในโค้ดที่เขียนด้วยมือ?
ตัวสร้างโค้ดมักจะง่ายกว่าเมื่อสร้างผลลัพธ์โดยใช้เครื่องหมายวงเล็บของ Microsoft ใหม่ ( []) สำหรับเกือบทุกอย่าง เมื่อฉันเห็นมันครั้งแรกฉันก็ยังว้าววววววววววววจุติของสัญกรณ์ตัวระบุที่ยกมาค่อนข้างห้าม เท่าที่ฉันรู้ว่ามันเป็นส่วนเสริมที่เป็นกรรมสิทธิ์จาก Microsoft (หมายถึง Oracle ไม่สนับสนุน) ดูที่ SQL Server ไม่มีความแตกต่างถ้าคุณกำหนดตารางเช่น CREATE TABLE [dbo].[Table_2] ([col1] [int], [col2] [int]); หรือ CREATE TABLE dbo.Table_2 (col1 int, col2 int); มันเป็นเรื่องของสไตล์ส่วนตัวหรือองค์กร คงเส้นคงวา. ตอนนี้ถ้าคุณต้องการโยกย้ายฐานข้อมูลของคุณไปยัง Oracle วงเล็บจะไม่มีตัวเลือก คุณสามารถใช้ตัวระบุที่เสนอราคาแบบเก่า แต่ตัวพิมพ์เล็กและตัวพิมพ์เล็กนั้นทำให้เกิดปัญหามากมาย เป็นความคิดที่ดีหรือไม่ที่จะลบวงเล็บทั้งหมดออกจากรหัสที่สร้างหลีกเลี่ยงการใช้ช่องว่างตัวอักษรพิเศษอื่น ๆ และคำหลักที่สงวนไว้สำหรับชื่อและรหัสในวิธีที่ DBMS ส่วนใหญ่เข้าใจ

1
ถอดรหัส Base64 String ใน SQL Server
ฉันมีvarcharคอลัมน์ในตารางใน SQL Server ซึ่งเก็บสตริงข้อความที่เข้ารหัส base64 ซึ่งฉันต้องการถอดรหัสเป็นข้อความธรรมดาที่เทียบเท่า SQL Server มีฟังก์ชันดั้งเดิมใด ๆเพื่อจัดการกับสิ่งนี้หรือไม่? สตริง base64 ตัวอย่าง: cm9sZToxIHByb2R1Y2VyOjEyIHRpbWVzdGFtcDoxNDY4NjQwMjIyNTcxMDAwIGxhdGxuZ3tsYXRpdHVkZV9lNzo0MTY5ODkzOTQgbG9uZ2l0dWRlX2U3Oi03Mzg5NjYyMTB9IHJhZGl1czoxOTc2NA== ซึ่งถอดรหัสเป็น: role:1 producer:12 timestamp:1468640222571000 latlng{latitude_e7:416989394 longitude_e7:-738966210} radius:19764

4
วิธีการเลือกแถวแรกจากการเข้าร่วมที่ส่งกลับหลายแถวในคีย์หลัก
สิ่งนี้เกี่ยวข้องกับคำถามนี้: การรวมผลลัพธ์หลาย ๆ ตารางเข้าด้วยกันเป็นแถว ฉันมีสองตารางที่ฉันเข้าร่วม พวกเขาแบ่งปันกุญแจ ตารางบุคคลมีชื่อหนึ่งชื่อต่อคีย์หลัก แต่ตารางอีเมลนั้นมีหลายอีเมลต่อ personId ฉันต้องการแสดงอีเมลแรกต่อคนเท่านั้น ปัจจุบันฉันได้รับหลายแถวต่อคนเพราะพวกเขามีอีเมลหลายฉบับ ฉันใช้ SQL-Server 2005 แก้ไข: นี่คือ T-SQL อีเมลแรกคือแถวอีเมลแรกต่อคน แก้ไข 2: อีเมลแรกที่ฉันเห็นมันจะเป็นแถวอีเมลแรกที่แสดงในการเข้าร่วมเมื่อ SQL ทำงานผ่านการสืบค้น ฉันไม่สำคัญว่าจะแสดงอีเมลใด มีเพียงอีเมลเดียวเท่านั้นที่ปรากฏขึ้น ฉันหวังว่ามันจะชัดเจนยิ่งขึ้น Table1: Person Table2: Email Select Person.PersonName, Email.Email From person left join on Person.ID=Email.PersonId;

6
การเปลี่ยนรหัสผ่าน sa
ฉันกำลังพยายามเปลี่ยนรหัสผ่านของบัญชี sa โดยใช้ SQL Server Management Studio 2012 ฉันได้ทำตามขั้นตอนด้านล่าง แต่รหัสผ่านยังคงเหมือนเดิม ล็อกอินเข้าสู่ SQL Server Management Studio, เลือกโปรแกรมฐานข้อมูล, \ SBSmonitoring, Windows Authentication ไปที่ Object Explorer - โฟลเดอร์ความปลอดภัย - โฟลเดอร์เข้าสู่ระบบ คลิกขวาที่บัญชี SA และเลือกตัวเลือกคุณสมบัติ ในหน้าทั่วไปเปลี่ยนรหัสผ่าน SA และยืนยัน ในหน้าสถานะเปลี่ยนเข้าสู่การเปิดใช้งาน คลิกตกลงเพื่อบันทึกการเปลี่ยนแปลง รีสตาร์ทเซิร์ฟเวอร์ SQL และบริการทั้งหมด ความคิดใด ๆ
15 sql-server 


1
ลบแถวที่ไม่ได้อ้างอิงในตารางอื่น
ฉันมีสองตารางในฐานข้อมูล PostgreSQL 9.3 ตารางที่link_replyมีคีย์ต่างประเทศชื่อชี้ไปที่โต๊ะwhich_grouplink_group ฉันต้องการลบแถวทั้งหมดจากlink_groupที่ไม่มีแถวที่เกี่ยวข้องlink_replyอยู่ ฟังดูธรรมดาพอ แต่ฉันก็ดิ้นรนกับมัน มันจะเป็นอะไรที่เรียบง่ายแบบนี้ (ไม่ทำงาน)? DELETE FROM link_group WHERE link_reply = NULL;

1
มีวิธีที่สง่างามในการส่งผลการสืบค้นโดยตรงไปยังเครื่องพิมพ์จริงหรือไม่?
ฉันมีคำขอนี้แปลกที่จะมีรายงานที่กำหนดและพิมพ์ไปยังเครื่องพิมพ์ รายงานเองนั้นค่อนข้างง่ายและพอดีกับหน้าเดียว ฉันสามารถพิมพ์ลงใน txt ได้และมันก็ใช้ได้ (แม้ว่าฉันจะเปิดรับข้อเสนอแนะเกี่ยวกับผลิตภัณฑ์ที่ดีกว่า) นี่คือรหัส มันได้ผล. แต่ฉันไม่ชอบมัน โดยเฉพาะ id ต้องการลบด้วย @bcp และ @SQL ที่ซ้อนกัน คำถาม:มีวิธีที่สง่างามกว่านี้หรือไม่? declare @filepath varchar(255), @filename varchar(255), @filetype varchar(255), @sql nvarchar(max), @coverpage_text nvarchar(max) set @filepath = 'C:\users\jmay\documents\' SET @filename = 'TestFile' set @filetype = '.txt' --output to txt set @sql = N'declare @bcp varchar(4000) set …
14 sql-server 

3
ทำไม MySQL ไม่สนใจดัชนีแม้จะมีผลบังคับใช้สำหรับการสั่งซื้อนี้ด้วย?
ฉันทำงานEXPLAIN: mysql> explain select last_name from employees order by last_name; +----+-------------+-----------+------+---------------+------+---------+------+-------+----------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-----------+------+---------------+------+---------+------+-------+----------------+ | 1 | SIMPLE | employees | ALL | NULL | NULL | NULL | NULL | …

4
RAID0 แทนที่จะเป็น RAID1 หรือ 5 นี่มันบ้าหรือเปล่า
ฉันกำลังพิจารณาใช้การตั้งค่า RAID0 สำหรับหนึ่งในกลุ่มเซิร์ฟเวอร์ SQL ของเรา ฉันจะร่างสถานการณ์และกำลังหาสาเหตุที่อาจเป็นความคิดที่ไม่ดี นอกจากนี้ถ้าคนที่คุณใช้เคสเอกสารสีขาวหรือเอกสารอื่น ๆ คุณสามารถชี้ให้ฉันเห็นในหัวข้อนี้ได้ เรามี 3 เซิร์ฟเวอร์ใน 2 ดาต้าเซ็นเตอร์ซึ่งเป็นส่วนหนึ่งของคลัสเตอร์ SQL พวกเขากำลังเรียกใช้ SQL Server ทั้งหมดในกลุ่มความพร้อมใช้งาน ตัวหลักมีแบบจำลองอยู่ข้าง ๆ และอีกตัวในดาต้าเซ็นเตอร์อื่น พวกเขากำลังเรียกใช้การจำลองแบบซิงโครนัสกับ failover อัตโนมัติ ไดรฟ์ทั้งหมดเป็น SSD ระดับองค์กร พวกเขาจะใช้ SQL Server 2017 หรือ 2019 ฉันคิดว่ามันจะมีประโยชน์หลายอย่างในการใช้งาน RAID0 ในอาร์เรย์มากกว่าวิธีอื่น ๆ หากมีข้อเสียจริง ข้อเสียเชิงลบที่ฉันเห็นอยู่ในขณะนี้คือการขาดความซ้ำซ้อนบนเซิร์ฟเวอร์หลักดังนั้นจึงไม่สามารถเพิ่มได้ ในฐานะที่เป็นข้อดี: หากไดรฟ์ล้มเหลวแทนที่จะทำงานในสถานะที่ช้าและเสื่อมโทรมจนกว่าจะมีคนได้รับการแจ้งเตือนว่ามีการกระทำด้วยตนเองเซิร์ฟเวอร์จะไม่สามารถทำการสำรองข้อมูลได้ทันที สิ่งนี้จะมีประโยชน์เพิ่มเติมในการแจ้งให้เราทราบถึงความล้มเหลวดังนั้นเราจึงสามารถตรวจสอบสาเหตุได้เร็วขึ้น มันลดโอกาสของความล้มเหลวโดยรวมต่อกำลังการผลิต TB เนื่องจากเราไม่ต้องการพาริตีหรือมิรเรอร์ไดร์ฟเราจึงลดจำนวนไดรฟ์ต่ออาเรย์ เมื่อมีไดรฟ์น้อยลงโอกาสในการเกิดความล้มเหลวก็จะน้อยลง มันถูกกว่า. ต้องการไดรฟ์น้อยลงสำหรับความจุที่ต้องการของเราลดค่าใช้จ่ายอย่างเห็นได้ชัด ฉันรู้ว่านี่ไม่ใช่ความคิดทางธุรกิจทั่วไป …

1
การประเมินภาวะเชิงหัวใจนอกฮิสโตแกรม
ติดตั้ง ฉันมีปัญหาในการทำความเข้าใจการประเมินความสำคัญเชิงหัวใจ นี่คือการตั้งค่าการทดสอบของฉัน: เวอร์ชัน 2010 ของฐานข้อมูล Stack Overflow SQL Server 2017 CU15 + GDR (KB4505225) - 14.0.3192.2 CE ใหม่ (ระดับความเข้ากันได้ 140) ฉันมี proc นี้: USE StackOverflow2010; GO CREATE OR ALTER PROCEDURE #sp_PostsByCommentCount @CommentCount int AS BEGIN SELECT * FROM dbo.Posts p WHERE p.CommentCount = @CommentCount OPTION (RECOMPILE); END; GO ไม่มีดัชนีหรือสถิติที่ไม่ใช่คลัสเตอร์ในdbo.Postsตาราง …

2
สแกนแกนอย่างต่อเนื่อง
ฉันมีตารางที่มีแถวไม่กี่สิบแถว การตั้งค่าแบบง่ายกำลังติดตาม CREATE TABLE #data ([Id] int, [Status] int); INSERT INTO #data VALUES (100, 1), (101, 2), (102, 3), (103, 2); และฉันมีแบบสอบถามที่รวมตารางนี้เข้ากับชุดของค่าตารางที่สร้างแถว (ทำจากตัวแปรและค่าคงที่) เช่น DECLARE @id1 int = 101, @id2 int = 105; SELECT COALESCE(p.[Code], 'X') AS [Code], COALESCE(d.[Status], 0) AS [Status] FROM (VALUES (@id1, 'A'), (@id2, 'B') ) p([Id], …

3
เชื่อมค่าทั้งหมดขององค์ประกอบ XML เดียวกันโดยใช้ XPath / XQuery
ฉันมีค่า XML ดังนี้: <R> <I>A</I> <I>B</I> <I>C</I> ... </R> ฉันต้องการที่จะเชื่อมทุกค่าและพวกเขากลับเป็นสตริงเดียว:IABC... ตอนนี้ฉันรู้แล้วว่าฉันสามารถทำลาย XML, รวมผลลัพธ์กลับเป็น XML แบบไม่มีโหนดและนำ.values('text()[1]', ...)ไปใช้กับผลลัพธ์: SELECT ( SELECT n.n.value('text()[1]', 'varchar(50)') AS [text()] FROM @MyXml.nodes('/R/I') AS n (n) FOR XML PATH (''), TYPE ).value('text()[1]', 'varchar(50)') ; อย่างไรก็ตามฉันต้องการทำทุกอย่างที่ใช้วิธี XPath / XQuery เท่านั้นสิ่งนี้: SELECT @MyXml. ? ( ? ); มีวิธีดังกล่าวหรือไม่? เหตุผลที่ฉันกำลังมองหาวิธีแก้ปัญหาในทิศทางนี้เป็นเพราะ XML …

1
เรียงลำดับการรั่วไหลไปยัง tempdb แต่แถวโดยประมาณจะเท่ากับแถวจริง
บน SQL Server 2016 SP2 ที่มีหน่วยความจำสูงสุดตั้งไว้ที่ 25GB เรามีแบบสอบถามที่ดำเนินการประมาณ 80 ครั้งในหนึ่งนาที แบบสอบถามรั่วไหลประมาณ 4,000 หน้าไปยัง tempdb ซึ่งทำให้ IO จำนวนมากบนดิสก์ของ tempdb เมื่อคุณดูที่แผนแบบสอบถาม (แบบสอบถามแบบง่าย) คุณจะเห็นว่าจำนวนแถวโดยประมาณเท่ากับจำนวนแถวจริง แต่ยังคงเกิดการรั่วไหล ดังนั้นสถิติที่ล้าสมัยไม่สามารถเป็นสาเหตุของปัญหาได้ ฉันทำการทดสอบและแบบสอบถามต่อไปนี้รั่วไหลไปยัง Tempdb: select id --uniqueidentifier from SortProblem where [status] ='A' order by SequenceNumber asc option (maxdop 1) แต่ถ้าฉันเลือกคอลัมน์อื่นจะไม่มีการรั่วไหลเกิดขึ้น: select startdate --datetime from SortProblem where [status] ='A' order …

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