Skip to content
No results
  • About Me (Resume)
  • Meetup Note/Share
  • เงินทอง งอกเงย
naiwaen@DebuggingSoft วงแหวนเว็บ
  • About Me (Resume)
  • Meetup Note/Share
  • เงินทอง งอกเงย
naiwaen@DebuggingSoft วงแหวนเว็บ
Jpeg

[MSSQL] ตัวอย่าง Script ที่ช่วยในการสร้าง User หลัง Restore Database

  • AdminpingAdminping
  • August 11, 2017
  • MS SQL Server

Blog เขียนมา เพราะ หลังจากได้รับไม้ต่อ ให้มาดูเคสนึงครับ ซึ่งถ้าขึ้นไม่ได้เนี่ย ลูกค้าขอเลื่อนการจ่ายเงินออกไปอีกครับ โดยตอนแรกปัญหาที่ได้รับมาจากทีม CS คือ

  • โปรแกรม Connector และ Excel-AddIns ใช้ไม่ได้เลยยย

พอเข้าไปผมเข้าไปเปิด Log4Net เป็นดูรายละเอียด Error ก็เจอว่า

เนื่องจากทาง CS ไม่สามารถแจ้งได้ว่า ตอนลงระบบเนี่ย เค้ามีขั้นตอนอย่างไร ทำให้การหาสาเหตุของปัญหายากมากครับ ผมเลยเสียเวลาไปกับการหาปัญหาของตัว Connector และ Excel-AddIns นานเลยครับ จนสุดท้ายลองเอา Tools ที่เคยทำมาทดสอบปรากฏว่าเป็นปัญหาที่ Database ครับ ไม่รู้ว่าใคร Restore ผิด?

  • Set User DB ให้เป็น db_denydatawriter - User DB เขียนลง Table ไม่ได้
  • ลืม Set User DB ให้เป็น db_owner ไม่เห็น Table เลย และปัญหาจุกจิอื่นๆครับ

สุดท้ายผม มา Refactor Script เพื่อจัดการกับสิทธิ์ครับ โดย Script นี้ผมลองทำขึ้นมาในช่วงปี 2012 เพราะ ขั้นตอนทำมือ โคตรเยอะ แล้วมี Refactor ตอนปี 2018 เลยมาก็แปะลง Blog เนี่ยแหละ เผื่อคนอื่นลองนำไปศึกษาครับ ผมใช้

  • สิทธิ Windows Authentication ในการ Run ครับ
  • Script ด้านล่างนี้ สร้าง และทดสอบบน MSSQL Server 2005 / 2008
--ตรวจสอบ User ก่อนว่า Instane มี User นี้ หรือป่าว ? ถ้าไม่ก็สร้าง
IF  NOT EXISTS (SELECT * FROM sys.server_principals WHERE name = N'invest')
                CREATE LOGIN [invest] WITH PASSWORD = 0x0100E1BCBAF63A22EDDC4FCEE2551E32A45C51363F0A9AD4D95F HASHED, SID = 0x1B16028920ADF147BA9744E7CAE21EBF, DEFAULT_DATABASE = [master], CHECK_POLICY = OFF, CHECK_EXPIRATION = OFF
GO
IF  NOT EXISTS (SELECT * FROM sys.server_principals WHERE name = N'bonanza')
                CREATE LOGIN [bonanza] WITH PASSWORD = 0x01004D0ACBE8F6923518FBFCE9832985129E2ECB2A2B23DA99C3 HASHED, SID = 0x5AAEDC9C5626F345AD2052EE739879FE, DEFAULT_DATABASE = [master], CHECK_POLICY = OFF, CHECK_EXPIRATION = OFF
GO
--////////////////////////////////////////////////////////
--จัดการ user ของ DB
--เอาสิทธิ์การเป็นเจ้าของ Schema INVEST ไปให้ dbo ก่อนเพื่อป้องกันปัญหาลบ User ไม่ได้ เพราะเป็นเจ้าของ Schema
ALTER AUTHORIZATION ON SCHEMA::INVEST TO dbo;
ALTER AUTHORIZATION ON SCHEMA::db_owner TO dbo;
--ลบ User ของ DB
DROP USER [invest];
DROP USER [bonanza];
--สร้าง User ใหม่
CREATE USER bonanza FOR LOGIN bonanza WITH DEFAULT_SCHEMA = INVEST;
CREATE USER invest FOR LOGIN invest WITH DEFAULT_SCHEMA = INVEST;
Go
--ใส่ Role ให้เป็น DB OWNER
EXEC sp_addrolemember 'db_owner', 'bonanza'
Go
EXEC sp_addrolemember 'db_owner', 'invest'
Go
--คืนสิทธิ์ให้เจ้าของ Schema Invest กลับไปให้ user invest
ALTER AUTHORIZATION ON SCHEMA::INVEST TO invest;

Reference

  • CREATE LOGIN (Transact-SQL) - SQL Server | Microsoft Docs

Share this:

  • Tweet
  • Click to email a link to a friend (Opens in new window) Email
  • Click to print (Opens in new window) Print
  • Click to share on Telegram (Opens in new window) Telegram
  • Click to share on WhatsApp (Opens in new window) WhatsApp

Like this:

Like Loading...

Related


Discover more from naiwaen@DebuggingSoft

Subscribe to get the latest posts sent to your email.

Tags
# MSSQL# Authorization# Restore# Permission# role member# Script Create Login

About me

Adminping

Adminping

My name is Chatri Ngambenchawong and I am a Software Developer, Blogger, Geek and FoodMania ^__^

View Full Profile →

Donate (ร่วมสนับสนุน)

Facebook Page

Facebook Page

Categories

Archives

Pages

  • About Me (Resume)
  • Meetup Note/Share
  • นโยบายการใช้คุกกี้ (Cookies Policy)
  • นโยบายความเป็นส่วนตัวของข้อมูล (Privacy Policy)
  • เงินทอง งอกเงย

Recent Posts

  • แยกร่างมาฟัง Global Azure 2025 Thailand + AzureSecEve
  • [CR] Starbucks Chicken Club Sandwich
  • เวลามี Merge Request / Pull Request มีแนวทางการตรวจยังไง
  • Spring Test Error java.lang.ClassNotFoundException: org.junit.platform.engine.reporting.OutputDirectoryProvider
  • [CR] Starbucks Spring Onion & Cream Cheese Bagel

Meta

  • Log in
  • Entries feed
  • Comments feed
  • WordPress.org

Related Posts

DB2 Data Type DECFLOAT แล้ว SQL Server ใช้อะไร ?

  • November 3, 2023

[MSSQL] สรุปงาน SQL Server Community Thailand Meeting #16

  • July 20, 2022

[MSSQL] สรุปงาน SQL Server Community Thailand Meeting #14

  • November 20, 2021

ถ้าสนใจ Blog สรุปต่างๆ ลองมา Subscribe กันได้ครับ เดี๋ยวจะมีเมล์จาก donotreply@wordpress.com มาให้กด Confirm อีกทีครับ

  • About Me (Resume)
  • นโยบายการใช้คุกกี้ (Cookies Policy)
Copyright © 2025 - WordPress Theme by CreativeThemes
Manage Cookie Consent
To provide the best experiences, we use technologies like cookies to store and/or access device information. Consenting to these technologies will allow us to process data such as browsing behavior or unique IDs on this site. Not consenting or withdrawing consent, may adversely affect certain features and functions.
Functional Always active
The technical storage or access is strictly necessary for the legitimate purpose of enabling the use of a specific service explicitly requested by the subscriber or user, or for the sole purpose of carrying out the transmission of a communication over an electronic communications network.
Preferences
The technical storage or access is necessary for the legitimate purpose of storing preferences that are not requested by the subscriber or user.
Statistics
The technical storage or access that is used exclusively for statistical purposes. The technical storage or access that is used exclusively for anonymous statistical purposes. Without a subpoena, voluntary compliance on the part of your Internet Service Provider, or additional records from a third party, information stored or retrieved for this purpose alone cannot usually be used to identify you.
Marketing
The technical storage or access is required to create user profiles to send advertising, or to track the user on a website or across several websites for similar marketing purposes.
Manage options Manage services Manage {vendor_count} vendors Read more about these purposes
View preferences
{title} {title} {title}
%d