db_owner ไม่สามารถปล่อยฐานข้อมูล - ข้อผิดพลาด 615, SQL Server


11

ฉันมีฐานข้อมูล SQL Server 2012 ที่ทำงานบน amazon EC2 ฉันได้สร้างผู้ใช้เพื่อให้สามารถสร้างแก้ไขและวางฐานข้อมูลได้ ฉันให้ผู้ใช้ใหม่ด้วยdbcreatorบทบาทเซิร์ฟเวอร์

ผู้ใช้ของฉันสามารถเชื่อมต่อจากระยะไกลและรันcreate database foo;คำสั่งได้สำเร็จ แต่เมื่อผู้ใช้พยายามวางฐานข้อมูลอีกครั้งด้วยdrop database foo;คำสั่งล้มเหลวด้วยข้อผิดพลาดดังต่อไปนี้:

Warning: Fatal error 615 occurred at Feb  1 2014  5:15PM.
   Note the error and time, and contact your system administrator.
ErrorCode: 21

แม้ว่าฐานข้อมูลที่เลือกคือmaster(ดังนั้นฉันไม่คิดว่ามันเป็นเพราะมีการใช้งาน) และคำสั่งสำเร็จเมื่อฉันเรียกใช้อีกครั้งในฐานะผู้ใช้ที่เป็นผู้ดูแลระบบ

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

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

ตามที่http://technet.microsoft.com/en-us/library/ms178613.aspxบทบาท db_owner ควรมีสิทธิ์เพียงพอ "ต้องการสิทธิ์การควบคุมบนฐานข้อมูลหรือแก้ไขสิทธิ์ฐานข้อมูลใด ๆ หรือการเป็นสมาชิกในบทบาทฐานข้อมูลคงที่ db_owner"

ฉันค้นหาข้อผิดพลาด 615 และพบว่า "ไม่พบตารางฐานข้อมูล ID% d ชื่อ '%. * ls' ซึ่งไม่มีเหตุผลสำหรับฉัน http://technet.microsoft.com/en-us/library/aa937592(v=sql.80).aspx

ข้อมูลรุ่นของเซิร์ฟเวอร์ SQL: Microsoft SQL Server 2012 (SP1) - 11.0.3368.0 (X64) /n May 22 2013 17:10:44 /n Copyright (c) Microsoft Corporation/n Express Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: ) (Hypervisor)/n- select @@versionจาก

คำตอบ:


12

ฉันเดาได้เลยว่าคุณมีตัวเลือก AutoClose สำหรับฐานข้อมูลที่ตั้งค่าเป็น True นี่เป็นพฤติกรรมเริ่มต้นเมื่อคุณสร้างฐานข้อมูลด้วย Express Editions

ข้อผิดพลาดดังกล่าวสามารถเกิดขึ้นได้อย่างแน่นอนในกรณีนี้ ที่จริงแล้วข้อความแสดงข้อผิดพลาดทั้งหมด 615 สถานะ: "Could not find database ID %d, name '%.*ls'. The database may be offline. Wait a few minutes and try again."... ดังนั้นจึงชี้ให้เห็นว่าฐานข้อมูลสามารถปิดได้ระหว่างการวาง

ดังนั้นไปที่คุณสมบัติ DB เปลี่ยนเป็น False แล้วลองวางอีกครั้งหรือใช้สคริปต์ด้านล่างก่อนวาง

ALTER DATABASE [MyDB] SET AUTO_CLOSE OFF 
GO

หลายคนชี้ให้เห็นว่าเป็นการดีกว่าที่จะให้ AutoClose ตั้งค่าเป็น False ฉันพบบทความนี้อธิบายเพิ่มเติมเล็กน้อยเกี่ยวกับ AutoClose: http://sqlmag.com/blog/worst-practice-allowing-autoclose-sql-server-database

ส่วนขยายเล็ก ๆ ของคำตอบ:

-- this works in standard SQL Server Editions, but NOT with Express Editions:
CREATE DATABASE [MyDB]
GO
DROP DATABASE [MyDB]
GO

-- this works in ALL SQL Server Editions
CREATE DATABASE [MyDB]
GO
ALTER DATABASE [MyDB] SET AUTO_CLOSE OFF 
GO
DROP DATABASE [MyDB]
GO

2

การกำหนดค่าที่คุณอธิบายควรจะใช้ได้

มีโอกาสใดบ้างที่คุณพยายามวางฐานข้อมูลในฐานะผู้ใช้อื่น

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


ฉันได้ลองกับ SSMS โดยตรงบนเซิร์ฟเวอร์ทำให้มีการเชื่อมต่อใหม่กับข้อมูลรับรองของผู้ใช้รายนี้ เหมือนกับผลลัพธ์จากระยะไกล ฉันเพิ่งตรวจสอบแล้วและผู้ใช้สามารถสร้างตารางแทรกแถวและอ่านแถวกลับได้สำเร็จ ฉันตรวจสอบผู้ใช้ที่ถูกต้องอีกครั้งก่อนที่จะดำเนินการค้นหาใน ssms และมันเป็น แต่หลังจากรันคำสั่งแบบเลื่อนมันเปลี่ยนเป็น "ไม่ได้เชื่อมต่อ" ฉันเดาว่าเป็นเพราะมันเป็นข้อผิดพลาดร้ายแรง แต่ฉันไม่ได้สังเกตเรื่องนี้มาก่อน
Tim Abell

2
@Tim: ใช่ข้อผิดพลาดของระดับ 20 และสูงกว่าปล่อยการเชื่อมต่อดังนั้นนั่นเป็นเพียงอาการ บันทึกข้อผิดพลาดของเซิร์ฟเวอร์ SQL หรือบันทึกเหตุการณ์ของแอปพลิเคชันให้ข้อมูลเพิ่มเติมหรือไม่
Jon Seigel

ฉันเกรงว่าฉันไม่ได้มีโอกาสกลับไปที่สิ่งนี้เพื่อตรวจสอบ แต่ขอบคุณสำหรับเคล็ดลับ ฉันจะตรวจสอบบันทึกในครั้งต่อไปที่ฉันดูในเรื่องนี้ (ไม่แน่ใจว่าจะเป็นเมื่อไหร่)
Tim Abell

0

ฉันไม่พบสาเหตุของสิ่งนี้ แต่วิธีแก้ปัญหาที่ดีที่สุดต่อไปนี้จะเปิดใช้งานคำสั่ง

มันเป็นความหวังของฉันมันชี้ไปที่ปัญหาและใครบางคนสามารถให้คำตอบที่ดีกว่า

ฉันใช้ Studio จัดการเซิร์ฟเวอร์ Microsoft SQL (ผู้ดูแลระบบ) ภายใต้การเข้าสู่ระบบความปลอดภัย localhost

ดับเบิลคลิกผู้ใช้เลือกบทบาทเซิร์ฟเวอร์กำหนด dbcreator พับลิกและ sysadm

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