การเข้าถึงถูกปฏิเสธเมื่อติดฐานข้อมูล


146

ฉันใช้รุ่นผู้พัฒนา SQL Server 2008 ฉันพยายามแนบฐานข้อมูล AdventureWorks2008

เมื่อฉันพยายามแนบฉันได้รับข้อผิดพลาด "การเข้าถึงถูกปฏิเสธ" ตามบันทึกเหตุการณ์มันมาจาก O / S:

เปิดล้มเหลว: ไม่สามารถเปิดไฟล์ D: \ ProjectData \ AdventureWorks \ AdventureWorksLT2008_Data.mdf สำหรับไฟล์หมายเลข 0 ข้อผิดพลาด OS: 5 (ปฏิเสธการเข้าถึง)

ฉันคิดว่า "ปัญหา NTFS" แต่ระบบ (และฉัน) มีการแก้ไขการเข้าถึงไฟล์ทั้งสอง

ฉันพบว่าฉันสามารถแนบฐานข้อมูลได้สำเร็จถ้าฉันลงชื่อเข้าใช้ด้วยชื่อ sa แต่บัญชีผู้ใช้ของฉันไม่ทำงาน

ฉันเป็นสมาชิกของกลุ่มผู้ดูแลท้องถิ่นบนเครื่องของฉันและฉันอยู่ในบทบาท sysadmins ในอินสแตนซ์ของ SQL Server

คิดว่าทำไมฉันต้องเข้าสู่ระบบในฐานะ sa?


ไฟล์ MDF เข้ารหัสโดยบังเอิญหรือไม่?
Brettski

Nope - ความอยากรู้จริงของฉันคือมันใช้งานได้ดีถ้าฉันลงชื่อเข้าใช้ด้วย sa (ใช้ Management Studio) แต่มันไม่ทำงานถ้าฉันใช้บัญชีผู้ดูแลระบบในเครื่อง บัญชีของฉันเป็นผู้ดูแลระบบผู้ดูแลโดเมนและเป็นบัญชีที่ฉันเข้าสู่ระบบภายใต้เมื่อฉันติดตั้ง SQL Server (ระหว่างการติดตั้งมีตัวเลือกให้บัญชีปัจจุบันของฉันเป็นระบบดูแลระบบและฉันทำเช่นนั้น)
JMarsch

1
นี่คือวิธีที่ UAC ทำงานใน W7 ไม่แปลกใจ
Al Kepp

@AlKepp Nope - ไม่ใช่สิ่งที่ UAC เพียงเข้าสู่ระบบในฐานะที่ถูกต้อง (บัญชีเซิร์ฟเวอร์ SQL ไม่มีส่วนเกี่ยวข้องกับ UAC) ปัญหา นอกจากนี้เพียงแค่เป็นสมาชิกของกลุ่มผู้ดูแลระบบในท้องถิ่นฉันได้รับอนุญาต - ฉันไม่ต้องเลื่อนระดับเพื่อให้ข้อมูลรับรองโฆษณาของฉันทำงานได้
JMarsch

คำตอบ:


162

เรียกใช้ Studio จัดการเซิร์ฟเวอร์ SQL ในฐานะผู้ดูแล (คลิกขวา -> เรียกใช้ในฐานะผู้ดูแล) ที่ดูแลความแปลกประหลาดทั้งหมดในกรณีของฉัน

SQL SRV EXPRESS 2008 R2 วินโดว 7


5
Running Management Studio ในฐานะผู้ดูแลระบบไม่ทำงานสำหรับฉัน ข้อผิดพลาดนี้เกิดขึ้นเมื่อพยายามเริ่มบริการ windows
nuzzolilo

9
การทำงานในฐานะผู้ดูแลระบบเป็นขั้นตอนแรก ขั้นตอนที่สองคือการเข้าสู่ระบบ SQL Server โดย Windows Authentication (วิธีนี้ใช้ได้ผลสำหรับฉัน!)
Furkan Ekinci

3
ทำงานให้ฉันด้วย ไม่สามารถพูดออกมาเป็นคำพูดว่าเบื่อหน่ายและทำลายสิทธิ์การใช้งานและข้อผิดพลาดบน Windows ฉันเป็นผู้บริหาร!
David Masters

ทำงานให้ฉันด้วย ตอนแรกฉันไม่คิดว่ามันจะใช้ได้เพราะ SSMS เป็นเพียงลูกค้า UI ฉันคิดว่าต้องการบริการเพื่อให้ทำงานในฐานะผู้ดูแลระบบ แต่การใช้ SSMS ในฐานะผู้ดูแลระบบก็เพียงพอแล้ว
ลุค Vo

2
ทำงานให้ฉันด้วย SQL Server 2019, SSMS 18.4
Ryan Thomas

104

ขอบคุณสำหรับความคิดเห็นทั้งหมด พวกคุณบางคนช่วยพาฉันไปหาคำตอบ นี่คือสิ่งที่ฉันพบ:

มันเป็นปัญหาสิทธิ์ NTFS ไม่ใช่ปัญหา SQL นอกจากนี้ยังมีลักษณะเหมือนแมลง (และมันทำซ้ำได้)

ปัญหา: บัญชีที่ฉันใช้มีสิทธิ์ควบคุม NTFS แบบเต็มไปยังไฟล์ mdf และ ldf อย่างไรก็ตามมีสิทธิ์เหล่านั้นผ่านการเป็นสมาชิกกลุ่ม (กลุ่มผู้ดูแลท้องถิ่นมีสิทธิ์และบัญชีของฉันเป็นสมาชิกของผู้ดูแลท้องถิ่น) (ฉันตรวจสอบสิทธิ์)

ถ้าฉันพยายามที่จะทำสิ่งที่แนบเชื่อมต่อกับ SQL Server เป็นฉัน (ที่ฉันอยู่ในกลุ่มผู้ดูแลระบบ) ก็ล้มเหลวด้วยปัญหา NTFS

อย่างไรก็ตามหากฉันให้สิทธิ์การใช้ไฟล์แบบเดียวกับที่กลุ่มผู้ดูแลระบบในท้องถิ่นมีกับบัญชีโดเมนของฉันโดยตรงฉันสามารถแนบได้โดยไม่มีปัญหา

(โอ้และใช่ฉันตรวจสอบกลุ่มท้องถิ่นบนเครื่องนี้และฉันยืนยันว่าบัญชีโดเมนของฉันเป็นสมาชิกของกลุ่มผู้ดูแลระบบในท้องถิ่น)

ดังนั้นดูเหมือนว่าข้อผิดพลาดเกิดขึ้นเนื่องจากรหัสบางอย่าง (ทั้งใน SQL Server หรือ Studio จัดการ) ตรวจสอบสิทธิ์ที่บัญชีผู้ใช้ถือ แต่ไม่ไปไกลเท่าที่จะตรวจสอบสิทธิ์กลุ่มที่บัญชีผู้ใช้สืบทอด

ฟังดูแปลกสำหรับฉัน แต่ฉันสามารถทำซ้ำได้ซ้ำแล้วซ้ำอีกดังนั้นฉันจึงสรุปว่านี่เป็นคำตอบ

อัปเดต:ฉันรายงานว่านี่เป็นข้อผิดพลาด: https://connect.microsoft.com/SQLServer/feedback/details/539703/access-denied-attaching-a-database-when-permissions-are-inherited


104
ถ้าอย่างฉันคุณใช้ Windows 7 คุณจะต้องเรียกใช้ Studio จัดการเซิร์ฟเวอร์ SQL ในฐานะผู้ดูแลระบบเพื่อหลีกเลี่ยงข้อผิดพลาดนี้
Antony

4
ทำซ้ำบน Win7 Pro โดยใช้ SS2008 Express ปัญหาเดียวกันสำหรับทั้ง sqlcmd และ SSMS == Meldung '5120', Ebene '16', สถานะ '101', เซิร์ฟเวอร์ 'DAGO \ SQLEXPRESS', Zeile 1 - 'Die physische Datei' D: \ data \ mssql \ drei.mdf 'kann nicht geöffnet werden Betriebssystemfehler 5: '5 (Zugriff verweigert) == ให้สิทธิ์การเข้าถึงแบบเต็มแก่ผู้ใช้ (ซึ่งเป็นสมาชิกของกลุ่มผู้ดูแลระบบภายในเครื่องซึ่งมีสิทธิ์เข้าถึง) แก้ไขปัญหาได้ นอกจากนี้การเรียกใช้ sqlcmd (หรือ SSMS ฉันเดา) เนื่องจากผู้ดูแลระบบไม่ได้สร้างข้อผิดพลาดนี้
Lumi

1
Anthony Highsky มีคำตอบ เพียงแค่ต้องแน่ใจว่าเรียกใช้ Management Studio ในฐานะผู้ดูแลระบบ
James

ปัญหาเดียวกันและวิธีแก้ปัญหาสำหรับฉัน 2008R2, Win 7, ฯลฯ เพียงแค่เพิ่มตัวเองลงในรายการความปลอดภัยอย่างชัดเจนและทำงานได้ ฉันคิดว่า SQL Server สามารถอ่านได้ครั้งเดียวแนบ แต่ไม่อยู่ภายใต้ข้อมูลประจำตัวของฉันเมื่อติด?
Andrew Backer

4
Running Management Studio ในฐานะผู้ดูแลระบบไม่ทำงานสำหรับฉัน ข้อผิดพลาดนี้เกิดขึ้นเมื่อพยายามเริ่มบริการ windows
nuzzolilo

20

ฉันต้องการเพิ่มข้อมูลเพิ่มเติมให้กับคำตอบที่โพสต์

ระวังเมื่อถอดฐานข้อมูลเนื่องจากผู้ใช้ windows ที่คุณเข้าสู่ระบบในฐานะผู้ใช้คนเดียวที่มีสิทธิ์ในไฟล์. mdf! สิทธิ์ดั้งเดิมของไฟล์. mdf ซึ่งรวมถึงผู้ใช้SQLServerMSSQLUser$<computer_name>$<instance_name>และบัญชีผู้ดูแลระบบจะถูกเขียนทับโดยผู้ใช้ windows ที่คุณล็อกอินด้วย (ไม่ใช่ผู้ใช้เซิร์ฟเวอร์ sql) บูมสิทธิ์ทั้งหมดหายไปอย่างนั้น ดังนั้นทำตามที่คนอื่นพูดและคลิกขวาไฟล์. mdf ของคุณและตรวจสอบการอนุญาตอีกครั้ง

ฉันพบปัญหานี้เพราะฉันใช้ SSMS เพื่อเชื่อมต่อกับฐานข้อมูล (ไม่สำคัญว่าบัญชีเซิร์ฟเวอร์ sql ใด) และถอดฐานข้อมูลออก หลังจากทำเช่นนั้นผู้ใช้ windows ของฉันเป็นคนเดียวที่มีสิทธิ์ใด ๆ ในไฟล์. mdf ดังนั้นในภายหลังเมื่อฉันพยายามแนบฐานข้อมูลโดยใช้บัญชี sa มันโยนข้อผิดพลาด "การเข้าถึงถูกปฏิเสธ"

เพื่อให้สิทธิ์ดั้งเดิมในการเจรจาคุณควรใช้ฐานข้อมูลออฟไลน์แล้วแยกออกจากนั้นแนบตามลำดับดังนี้:

USE [master]
GO
-- kick all users out of the db
ALTER DATABASE mydb
SET SINGLE_USER WITH ROLLBACK IMMEDIATE 
GO

-- Take the Database Offline
ALTER DATABASE mydb SET OFFLINE WITH
ROLLBACK IMMEDIATE
GO

-- detach the db
EXEC master.dbo.sp_detach_db @dbname = N'mydb'
GO

1
ขอบคุณสำหรับสิ่งนี้! ฉันคิดว่าการทำให้ถูกต้องง่ายขึ้นอย่างมากหากคุณลงชื่อเข้าใช้ด้วยบัญชี SQL Server ที่ได้รับการรับรองความถูกต้องด้วยสิทธิ์ของ serveradmin
William Rose

น่าเสียดายที่สิ่งนี้ไม่ได้ช่วยฉันเลยถ้าฉันสร้างฐานข้อมูลเป็น 'sa' แทนที่จะเป็นผู้ใช้ Windows
David Gardiner

"ระวังเมื่อถอดฐานข้อมูล" บอก SSMS ให้ระมัดระวัง ปัญหาของฉันเกิดขึ้นเนื่องจากการใช้ SSMS คำสั่งคัดลอกฐานข้อมูลล้มเหลวทำให้ฉันอยู่ในเมืองเพลาโดยไม่มีคำอธิบาย
Alan Macdonald

18

เพิ่มสิทธิ์ไปยังโฟลเดอร์ที่.mdfไฟล์ของคุณอยู่

ตรวจสอบชื่อนี้: NT Service\MSSQLSERVER

และเปลี่ยนเป็นLocationชื่อเซิร์ฟเวอร์ของคุณ


5
เพื่อหาชื่อบัญชีที่แน่นอนเพราะมันจะแตกต่างจากอินสแตนซ์อินสแตนซ์, SELECT servicename, service_account FROM sys.dm_server_servicesทำงานนี้:
Arve Systad

13

ปัญหานี้เกิดจาก UAC (การควบคุมบัญชีผู้ใช้) ใช่ไหม แม้ว่าบัญชีผู้ใช้ของคุณจะเป็นสมาชิกของกลุ่มผู้ดูแลระบบ แต่ UAC ใน Windows 7 ไม่อนุญาตให้คุณทำสิ่งต่าง ๆ ของผู้ดูแลระบบเว้นแต่คุณจะเรียกใช้โปรแกรม "ในฐานะผู้ดูแลระบบ" ไม่ใช่ข้อผิดพลาดจริงใน SQL Server หรือ Management Studio หรืออะไรก็ตาม (แม้ว่ามันอาจจะรู้ปัญหาและขอสิทธิ์การยกระดับแทนที่จะบ่น "ข้อผิดพลาด 5")


11

เรียกใช้ Studio จัดการเซิร์ฟเวอร์ SQL ในฐานะผู้ดูแล (คลิกขวา -> เรียกใช้ในฐานะผู้ดูแลระบบ) ทำงานให้ฉันด้วย Windows 7 - SQL Server 2008 R2


1
คำตอบนี้ควรถูกยกระดับ การใช้ SSMS ในฐานะผู้ดูแลระบบเป็นการแก้ปัญหาที่จำลองคำตอบนี้ Microsoft รายงานว่า "พฤติกรรมที่คาดหวัง" ที่นี่: ลิงก์
FreeText

สิ่งนี้ไม่เหมือนกับคำตอบของ MandoMando ใช่ไหม
mortb

10

สามารถแนบฐานข้อมูล SQL2005 ด้วยวิธีนี้ใน Windows 7:

start menu >
 all program >
  Microsoft sql server 2005 >
   sql server management studio >
    right click >
     run as administrator >
      click ok

แล้วแนบฐานข้อมูลเสร็จสมบูรณ์เรียบร้อยแล้ว


นี้ทำงานกับ SQL Server 2016 กับผู้บริหารสตูดิโอ 2008 R2 บน Windows 10 :)
ตราไว้หุ้นละ

9

เมื่อคุณเข้าสู่ระบบในฐานะsa(หรือบัญชี SQL Server ใด ๆ ) คุณทำงานเป็นบัญชีบริการ SQL Server เมื่อคุณเข้าสู่ระบบในขณะที่คุณคุณมีสิทธิ์ของบัญชีของคุณ ด้วยเหตุผลบางอย่างคุณไม่สามารถเข้าถึงไฟล์ที่เหมาะสม แต่บัญชีบริการทำ


ปัญหา NTFS เป็นสิ่งแรกที่ฉันคิดเช่นกัน แต่ดูเหมือนจะไม่เป็นปัญหา: ฉันเป็นสมาชิกของกลุ่มผู้ดูแลระบบในพื้นที่และฉันตรวจสอบว่าผู้ดูแลระบบมีสิทธิ์ "ควบคุมเต็มรูปแบบ" ในไฟล์ mdf และ ldf . นอกจากนี้ฉันเป็นเจ้าของไฟล์ - ฉันเพิ่งสร้างไดเรกทอรีและคัดลอกไฟล์ mdf / ldf ไปยังตำแหน่งของตนเอง
JMarsch

@JMarsch: @Nick บอกว่า 'sa' มีชุดของสิทธิ SQLSERVER - ไม่ใช่สิทธิ NTFS - ซึ่งบัญชีของคุณไม่มี
Trevoke

@Trevoke: ฉันอยู่กับคุณ หากเป็นกรณีนี้ฉันต้องกำหนดสิทธิ์ใดให้กับบัญชีผู้ใช้ของฉัน (ฉันได้รับมอบหมายให้ดูแลระบบแล้ว)
JMarsch

1
คำตอบเก่า ๆ แบบนี้ แต่สำหรับคนอย่างฉันเมื่อห้านาทีก่อน: คุณสามารถค้นหาชื่อผู้ใช้บริการที่แน่นอนได้ด้วยการวิ่งSELECT servicename, service_account FROM sys.dm_server_services
Arve Systad

6

ฉันพบโซลูชันนี้: คลิกขวาที่โฟลเดอร์ที่คุณเก็บไฟล์. mdf ของคุณ -> คลิกคุณสมบัติ -> เลือกแท็บความปลอดภัยคลิกแก้ไข ... และให้การควบคุมเต็มรูปแบบ หวังว่านี่จะช่วยได้!


5

saผู้ใช้ใช้บัญชี NTFS SQLServerMSSQLUser$<computer_name>$<instance_name>และSQLServerSQLAgentUser$<computer_name>$<instance_name>การเข้าถึงไฟล์ฐานข้อมูล คุณอาจต้องการลองเพิ่มการอนุญาตสำหรับหนึ่งหรือทั้งสองผู้ใช้เหล่านี้

ฉันไม่รู้ว่าจะแก้ปัญหาของคุณหรือไม่เพราะคุณบอกว่าคุณไม่มีปัญหากับsaผู้ใช้ แต่ฉันหวังว่ามันจะช่วยได้



5

ก็สามารถที่จะคง easlyแต่ radicaly เพียงแค่ไปที่โฟลเดอร์ที่คุณเก็บไว้ไฟล์ MDF เลือก File-> คลิกขวา -> คลิกที่คุณสมบัติและให้สิทธิ์แบบเต็มไปยังไฟล์สำหรับการเข้าสู่ระบบการรักษาความปลอดภัยของผู้ใช้


3

ทุกครั้งที่ฉันพบปัญหานี้คือเมื่อพยายามแนบฐานข้อมูลที่อยู่ในไดเรกทอรีอื่นจากไดเรกทอรีฐานข้อมูลเริ่มต้นที่ติดตั้งในเซิร์ฟเวอร์ SQL

ฉันขอแนะนำว่าแทนที่จะใช้วิธีการอนุญาตให้มีการอนุญาตในไดเรกทอรีและบัญชีต่างๆที่คุณเพียงแค่ย้ายไฟล์ข้อมูลของคุณไปยังไดเรกทอรีที่เซิร์ฟเวอร์ sql คาดว่าจะหาได้


ในหลาย ๆ สถานการณ์ฉันเห็นด้วยกับประเด็นของคุณ แต่ด้วยเซิร์ฟเวอร์ SQL คุณมักจะต้องการค้นหาฐานข้อมูลของคุณบนแกนหมุนหรือปริมาณที่แตกต่างกัน ในความเป็นจริงมันเป็นเรื่องธรรมดาที่จะวางบันทึกธุรกรรมบนแกนหมุนแยกจากฐานข้อมูลเพื่อปรับปรุงปริมาณงานของธุรกรรม
JMarsch

@JMarsch: ใช่ .. ไดเรกทอรีต่าง ๆ สามารถกำหนดค่าได้อย่างแน่นอนผ่านคุณสมบัติเซิร์ฟเวอร์> แท็บการตั้งค่าฐานข้อมูลสำหรับข้อมูลเริ่มต้นและตำแหน่งบันทึก ...
NotMe

ที่ครอบคลุมค่าเริ่มต้น แต่เป็นค่าเริ่มต้นเท่านั้น เป็นที่ยอมรับอย่างสมบูรณ์ในการวาง dbs ไว้ที่อื่นและไม่ใช่เรื่องแปลกหากคุณมีเซิร์ฟเวอร์ของคุณที่จัดการฐานข้อมูลที่ใช้งานมากกว่า 1 ฐาน
JMarsch

ฉันมีปัญหาเดียวกันนี้แม้จะมีไดเรกทอรีเซิร์ฟเวอร์ sql เริ่มต้น: c: \ Program Server \ MSSQL10_50.SPATIAL_IM \ MSSQL \ DATA \ mydb.mdf SQL Server \ MSSQL10_50.SPATIAL_IM \ MSATA \ myATA.mdf บน win7
goku_da_master

3

ฉันแค่ต้องการเพิ่มข้อมูลนี้เช่นกัน

http://www.mssqltips.com/sqlservertip/2528/database-attach-failure-in-sql-server-2008-r2/

สารละลาย

คุณได้รับข้อผิดพลาดนี้เนื่องจากการเข้าสู่ระบบที่แตกต่างกันสองครั้งได้ทำการแยกออกและดำเนินการแนบ ดังนั้นไฟล์เมื่อถูกแยกออกเป็นเจ้าของโดยการเข้าสู่ระบบครั้งแรก แต่สิ่งที่แนบมาล้มเหลวเนื่องจากการเข้าสู่ระบบที่ใช้ไม่ได้เป็นเจ้าของไฟล์ mdf และ ldf

เมื่อเราแยกไฟล์ฐานข้อมูลเจ้าของจะกลายเป็นบุคคลที่ใช้คำสั่ง detach เพื่อแก้ไขปัญหาที่เราต้องเปลี่ยนหรือเพิ่มชื่อเข้าสู่ระบบอื่นในฐานะเจ้าของไฟล์ mdf และ ldf

คลิกขวาที่ไฟล์ "filename.mdf" และเลือกคุณสมบัติเพื่อตรวจสอบการอนุญาตของไฟล์ mdf ที่นี่เราจะเห็นว่ามีเพียงหนึ่งบัญชีเท่านั้นที่ได้รับอนุญาตให้ใช้ไฟล์ "filename.mdf" เพราะนั่นคือบัญชีที่ใช้ในการแยกฐานข้อมูล

เพื่อแก้ไขปัญหานี้ให้คลิกที่ปุ่มเพิ่ม ... เพื่อเพิ่มการเข้าสู่ระบบอื่น ๆ หรือการเข้าสู่ระบบอื่น ๆ ที่จำเป็นและให้การควบคุมเต็มรูปแบบเข้าสู่ระบบ คุณควรทำสิ่งนี้สำหรับไฟล์ "ldf" เช่นกัน เมื่อคุณทำงานนี้เสร็จแล้วให้คลิกปุ่มตกลง (หมายเหตุสำหรับระบบปฏิบัติการรุ่นอื่น ๆ ที่คุณอาจมีตัวเลือกแก้ไขคลิกที่นี่ก่อนจากนั้นคุณจะเห็นตัวเลือกเพิ่ม ... )


ฉันเปลี่ยนการเชื่อมต่อของฉันใน SSMS เพื่อให้ตรงกับผู้ใช้ที่ทำการปลดและฉันสามารถทำการแนบ
glitzsfa

2

สำหรับสิ่งที่คุ้มค่าสำหรับทุกคนที่มีปัญหาเฉพาะที่ฉันมี:

  • SQL Express 2008
  • Visual Studio 2010 Premium

ผ่านเมนูบริบทของโฟลเดอร์ App_data ฉันได้สร้างฐานข้อมูล SQL Express เพื่อการดีบัก สตริงการเชื่อมต่อ (ใช้โดย NHibernate) มีดังนี้:

Server=.\SQLExpress;
AttachDbFilename=|DataDirectory|DebugDatabase.mdf;
Database=DebugDatabase;
Trusted_Connection=Yes;

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

สิ่งที่แก้ไขได้ในที่สุดก็คือการเปิด Server Explorer ใน Visual Studio จากนั้นเชื่อมต่อกับ MDF และแยกออกอีกครั้ง หลังจากฉันทำเสร็จแล้วเว็บแอปของฉันสามารถเข้าถึงฐานข้อมูลได้ดี

PS เครดิตไปที่โพสต์บล็อกนี้ฉันพบในขณะที่ Google ปัญหานี้โดยเฉพาะเรียกความคิดที่จะแนบ / แยกฐานข้อมูลเพื่อแก้ไขปัญหา


2

ฉันย้ายฐานข้อมูล mdf จากโฟลเดอร์ Data เริ่มต้นไปยังโฟลเดอร์ asp.net app_data ของฉันและพบปัญหานี้พยายามตั้งฐานข้อมูลกลับมาออนไลน์

ฉันเปรียบเทียบการตั้งค่าความปลอดภัยของฐานข้อมูลไฟล์อื่น ๆ ในตำแหน่งเดิมกับไฟล์ที่ย้ายแล้วและสังเกตว่า MSSQL $ SQLEXPRESS ไม่ได้รับอนุญาตให้ใช้ไฟล์ในตำแหน่งใหม่ ฉันได้เพิ่มการควบคุมแบบเต็มสำหรับ "NT SERVICE \ MSSQL $ SQLEXPRESS" (ต้องรวม NT SERVICE นั้น) และมันก็แนบมาได้

ปรากฏว่าโฟลเดอร์ข้อมูลดั้งเดิมมีสิทธิ์เหล่านี้และไฟล์จะสืบทอดมา ย้ายไฟล์และแบ่งมรดกแน่นอน

ฉันตรวจสอบไฟล์ mdf ของโครงการอื่นซึ่งฉันสร้างขึ้นโดยตรงไปยังโฟลเดอร์ app_data มันไม่มีสิทธิ์ $ SQLEXPRESS ของ MSSQL อืมม ฉันสงสัยว่าทำไม SQL Express จึงชอบ แต่ไม่เหมือนกัน


วิธีนี้ใช้ได้ผลกับฉันใน Windows 10 และ SQL Server 2017 เมื่อย้ายไฟล์บันทึกไปยังดิสก์อื่น ในกรณีของฉันชื่อผู้ใช้คือ "NT SERVICE \ MSSQLSERVER"
John Hanley

1

ดูเหมือนว่าสิทธิ์ NTFS โดยทั่วไปหมายถึงบัญชีบริการ SQL Server ของคุณมีการเข้าถึงไฟล์แบบอ่านอย่างเดียว (โปรดทราบว่า SQL Server ใช้บัญชีบริการเดียวกันเพื่อเข้าถึงไฟล์ฐานข้อมูลโดยไม่คำนึงว่าคุณจะลงชื่อเข้าใช้อย่างไร) คุณแน่ใจหรือว่าคุณไม่ได้เปลี่ยนการอนุญาตของโฟลเดอร์ระหว่างการล็อกอินด้วยตนเองและการเข้าสู่ระบบในฐานะ sa? หากคุณแยกออกและลองอีกครั้งปัญหานี้ยังคงมีอยู่หรือไม่


ในกรณีของฉันไม่ - ฉันทำซ้ำแล้วซ้ำอีกครั้งเพื่อตรวจสอบให้แน่ใจเซิร์ฟเวอร์ ปัญหาคือว่าบัญชีของฉันมีการเข้าถึงไฟล์ผ่านระดับทางอ้อม - ฉันเป็นสมาชิกของกลุ่ม Domain Admin ผู้ดูแลโดเมนเป็นสมาชิกของกลุ่ม Local Administrators บนเครื่องและ Local Admins (และระบบ) มีการควบคุมโฟลเดอร์อย่างสมบูรณ์ (ดังนั้นจึงมีการอ้อมกลุ่ม 2 ระดับ) ถ้าฉันกำหนดสิทธิ์ให้กับตัวเองโดยตรงมันใช้งานได้ถ้าฉันลบมันฉันยังคงสามารถคัดลอก / ลบไฟล์จาก Explorere ฯลฯ แต่ SQL Server ไม่สามารถโหลดได้
JMarsch

เมื่อพยายามแนบฐานข้อมูล เข้าสู่ระบบWindows authenticated userจะช่วยให้เราเอาชนะการอนุญาตในไฟล์ฐานข้อมูล (กรณีนี้อินสแตนซ์ MS SQLServer ในดิสก์มี Windows OS)
อย่านู Vy

1

ฉันมีปัญหาเดียวกันเมื่อติดฐานข้อมูล มันไม่ใช่ปัญหา SQL มันเป็นปัญหาบัญชี ไปที่แผงควบคุม / การตั้งค่าการควบคุมบัญชีผู้ใช้ / ตั้งเป็น "ไม่ต้องแจ้ง" ในที่สุดรีสตาร์ทคอมพิวเตอร์และทำงานให้ฉัน


1

ฉันแนบไฟล์ mdf โดยคลิกขวาที่ฐานข้อมูลและลบไฟล์บันทึก AdventureWorks2012_Data_log.ldf ในตัวช่วยสร้าง ไฟล์ mdf ถูกวางไว้ในตำแหน่งต่อไปนี้

    C:\Program Files\Microsoft SQL Server\MSSQL10.SQLEXPRESS\MSSQL\DATA

วิธีการข้างต้นช่วยให้ฉันแก้ไขปัญหาได้


1

ฉันกำลังอ่านหน้านี้และพวกเขามีประโยคที่น่าสนใจอยู่ที่นั่น:

ข้อควรระวัง: เลือกอย่างมากเมื่อเพิ่มผู้ใช้ในบทบาทเหล่านี้ ตัวอย่างเช่น sysadmin จะแม็พกับ dbo ในทุกฐานข้อมูลและเทียบเท่ากับการล็อกอินโดยใช้บัญชี sa

แน่นอนพวกเขามีสิ่งนี้ด้วย:

สิทธิ์ที่มอบให้แก่ผู้ใช้และบทบาทและเฉพาะฐานข้อมูล สิทธิ์ทั้งหมดจะสะสมด้วยข้อยกเว้นของ DENY การอนุญาตที่ถูกปฏิเสธที่ระดับผู้ใช้หรือที่ระดับบทบาทจะแทนที่การอนุญาตเดียวกันที่ได้รับผ่านการเป็นสมาชิกบทบาทอื่นด้วยข้อยกเว้นของบทบาทเซิร์ฟเวอร์คงที่ sysadmin (ระบบดูแลรักษาสิทธิ์ทั้งหมดแม้ว่าบทบาทที่พวกเขาเป็นสมาชิกของมีสิทธิ์ DENY)

ดังนั้นหากคุณเป็นผู้ดูแลโดเมนและในกลุ่ม 'ดูแลระบบ' SQL โลกควรเป็นสัตว์น้ำที่มีเปลือกแข็งของคุณ

แน่นอนตาม Microsoft คุณควรดูสองหน้านี้อย่างรวดเร็ว:
ลิงก์ไปยังข้อกำหนดเบื้องต้นของฐานข้อมูล

ลิงก์ไปยังการติดตั้งฐานข้อมูล

คุณกำลังซนและพยายามที่จะแนบมันด้วยตนเอง :) อย่างจริงจังคุณมีสิ่งที่จำเป็นทั้งหมดสำหรับฐานข้อมูล AdventureWorks2008 หรือไม่?
ฉันสงสัยว่านี่เป็นอีกกรณีของ Microsoft / กรณีแปลก แต่ฉันอาจจะผิด


+1 เพราะความคิดเห็นของคุณช่วยให้ฉันค้นหาคำตอบได้ ฉันจะโพสต์สิ่งที่ค้นพบของฉันไปที่หัวข้อนี้ BTW (ฉันเป็น "ซุกซน" เนื่องจากนโยบายแปลก ๆ ที่ฉันทำงาน - ฐานข้อมูล adventureworks ถูกแจกจ่ายเป็น exe ฉันไม่สามารถดาวน์โหลด exe ได้ (ฉันสามารถดาวน์โหลดไฟล์ zip และไฟล์ MSI ดังนั้นฉันจึงไม่เห็น วิธีการกรอง exe จะทำอย่างไรดีกว่าวิธีอื่น ๆ แต่มีกฎ) อย่างไรก็ตามฉันสามารถรับไฟล์ mdf ดิบเป็นรหัสไปรษณีย์จาก codeplex และนั่นคือเมื่อฉันวิ่งเข้าสู่ความอยากรู้เล็ก ๆ น้อย ๆ นี้
JMarsch

1

ป้อนคำอธิบายรูปภาพที่นี่

USE [master]
GO
CREATE DATABASE [DataBasename] ON 
( FILENAME = N'C:\data\DataBasename.mdf' )
 FOR ATTACH
GO

เปลี่ยนเป็น FOR ATTACH -> สำหรับ ATTACH_FORCE_REBUILD_LOG

USE [master]
GO
CREATE DATABASE [DataBasename] ON 
( FILENAME = N'C:\data\DataBasename.mdf' )
 FOR ATTACH_FORCE_REBUILD_LOG
GO

ขอบคุณคุณบันทึกวันของฉัน
Shahrokhian

1

ฉันได้รับข้อผิดพลาดนี้ว่า sa ในกรณีของฉันความปลอดภัยของฐานข้อมูลไม่สำคัญ ฉันเพิ่มทุกคนควบคุมไฟล์ mdf และ ldf และแนบได้ดี


1

ฉันกำลังเผชิญปัญหาเดียวกันใน VS 2019 หากใครยังคงประสบปัญหาเดียวกันโปรดตรวจสอบว่าคุณมี / ทำสิ่งต่อไปนี้:

  1. คุณควรติดตั้ง SQL Express บน m / c ของคุณ
  2. ควรมี SSDT ติดตั้งใน VS (ใน VS 2019- ตรวจสอบให้แน่ใจว่าได้ตรวจสอบส่วนประกอบนี้ขณะติดตั้ง) สำหรับเวอร์ชันก่อนหน้า - คุณต้องเพิ่มส่วนประกอบนี้จากภายนอก
  3. เพิ่ม 'User Instance = True' ให้กับ connectionstring ของคุณ
  4. ฉันคิดว่ามันเป็นตัวเลือก - เปิด VS และ SQL Express ในโหมดผู้ดูแลระบบและเข้าสู่ระบบในฐานะผู้ดูแลระบบของ SQL Express

0

มันเป็นความจริงสิทธิ์ NTFS และข้อผิดพลาดแปลกใน SQL Server ฉันไม่แน่ใจว่ารายงานข้อผิดพลาดด้านบนนั้นถูกต้องหรืออาจอ้างถึงข้อผิดพลาดเพิ่มเติม

เพื่อแก้ไขปัญหานี้ใน Windows 7 ฉันใช้ SQL Server Management Studio ตามปกติ (ไม่ใช่ในฐานะผู้ดูแลระบบ) ฉันพยายามแนบไฟล์ MDF ในกระบวนการฉันใช้ UI แทนการวางในเส้นทาง ฉันสังเกตเห็นว่าเส้นทางนั้นถูกตัดขาดจากฉัน นี่เป็นเพราะผู้ใช้ MS SQL Server (SQLServerMSSQLUser $ machinename $ SQLEXPRESS) ที่ซอฟต์แวร์เพิ่มไว้สำหรับคุณไม่มีสิทธิ์ในการเข้าถึงโฟลเดอร์ (ในกรณีนี้โฟลเดอร์จะลึกลงไปในโฟลเดอร์ผู้ใช้ของฉันเอง)

การวางเส้นทางและดำเนินการผลลัพธ์ในข้อผิดพลาดด้านบน ดังนั้น - ฉันให้สิทธิ์ผู้ใช้ MS SQL Server เพื่ออ่านเริ่มต้นจากไดเรกทอรีแรกที่ถูกปฏิเสธ (โฟลเดอร์ผู้ใช้ของฉัน) จากนั้นฉันก็ยกเลิกการดำเนินการเผยแพร่ทันทีเนื่องจากอาจใช้เวลาชั่วนิรันดร์และใช้สิทธิ์การอ่านอีกครั้งกับโฟลเดอร์ย่อยถัดไปที่จำเป็นและให้เผยแพร่อย่างเต็มที่

ในที่สุดฉันก็ให้สิทธิ์ผู้ใช้ MS SQL Server ในการปรับเปลี่ยนการอนุญาตไปยังไฟล์. pdf และ. ldf สำหรับฐานข้อมูล

ตอนนี้ฉันสามารถแนบไฟล์ฐานข้อมูลได้แล้ว


0

หากคุณเรียกใช้ sql server 2012 คุณสามารถรับข้อผิดพลาดนี้ได้โดยพยายามแนบไฟล์ mdf รุ่นเก่า เช่นไฟล์ mdf จาก sql server 2008


ฉันคิดว่าส่วนนั้นค่อนข้างอธิบายตนเอง มันเป็นการดีที่จะรู้วิธีแยกแยะ
dansan

0

ฉันได้แก้ไขปัญหาโดยเพียงแค่ย้ายไฟล์. mdf ที่คุณต้องการแนบไปยังโฟลเดอร์สาธารณะในกรณีของฉันฉันย้ายไปยังผู้ใช้ / โฟลเดอร์สาธารณะ จากนั้นฉันก็แนบมันจากที่นั่นโดยไม่มีปัญหาใด ๆ หวังว่านี่จะช่วยได้


0

สำหรับผู้ที่ไม่สามารถแก้ไขปัญหาด้วยโซลูชันอื่น ๆ ได้ที่นี่การแก้ไขต่อไปนี้ใช้งานได้สำหรับฉัน:

ไปที่โฟลเดอร์ "DATA" ของคุณในการติดตั้ง SQL Server ของคุณคลิกขวาคุณสมบัติแท็บความปลอดภัยและเพิ่มสิทธิ์ควบคุมทั้งหมดสำหรับผู้ใช้ "NETWORK SERVICE"

http://decoding.wordpress.com/2008/08/25/sql-server-2005-expess-how-to-fix-error-3417/

(ลิงค์ด้านบนใช้สำหรับ SQL 2005 แต่นี่เป็นการแก้ไขการติดตั้ง SQL 2008 R2 สำหรับฉัน)

ข้อมูลเพิ่มเติมบางส่วน: ปัญหานี้ปรากฏขึ้นสำหรับฉันหลังจากแทนที่ฮาร์ดไดรฟ์รอง (ซึ่งติดตั้ง SQL อยู่) ฉันคัดลอกไฟล์ทั้งหมดและเรียกคืนอักษรชื่อไดรฟ์ต้นฉบับไปยังฮาร์ดดิสก์ใหม่ อย่างไรก็ตามไม่มีการคัดลอกการอนุญาตด้านความปลอดภัย ฉันคิดว่าครั้งต่อไปฉันจะใช้วิธีที่ดีกว่าในการคัดลอกข้อมูล


0

ในกรณีของฉันสิ่งที่แก้ไขปัญหาคือ folowing:

USE [master]
GO
CREATE DATABASE [AdventureWorks2008R2] ON
( FILENAME = 'C:\Program Files\Microsfot SQL Server\MSSQL10_50.SQLEXPRESS\MSSQL\DATA\AdventureWors2008R2_Data.mdf')
FOR ATTACH_REBUILD_LOG

0

คัดลอกฐานข้อมูลไปยังโฟลเดอร์อื่นและแนบหรือเข้าสู่ระบบ SQLServer ด้วย "Windows Authentication"

ป้อนคำอธิบายรูปภาพที่นี่


0

ฉันมีปัญหาเดียวกันเมื่อทำการแนบฐานข้อมูลอีกครั้งหลังจากการถอดและย้ายไฟล์ ldf และ mdf จากไดรฟ์ C ไปยัง F

เพื่อแก้ไขฉันต้องเพิ่มสิทธิ์หลักของ OWNER ให้กับไฟล์ทั้งสองและให้การควบคุมเต็มรูปแบบในแท็บความปลอดภัยของกล่องโต้ตอบคุณสมบัติ

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