首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

VC++ ADO 動態管理 SQL Server 7 登入帳號與資料庫權限

     編輯:VC 教學

架構

使用 ADO (`_ConnectionPtr`, `_RecordsetPtr`) 呼叫 SQL Server 系統存儲過程 (`sp_addlogin`, `sp_grantdbaccess`, `sp_droplogin`, `sp_revokedbaccess`) 及系統表 (`master..sysdatabases`, `master..syslogins`, `db..sysusers`) 實現帳號全生命週期管理。

核心功能模組

1. 列出所有資料庫


void CUserMgr::LoadDatabases() {
    _RecordsetPtr rs; rs.CreateInstance(__uuidof(Recordset));
    rs->Open("SELECT name FROM master..sysdatabases", m_cn, adOpenDynamic, adLockOptimistic, adCmdText);
    while (!rs->EndOfFile) {
        m_cbDatabase.AddString((char*)(_bstr_t)rs->Fields->Item["name"]->Value);
        rs->MoveNext();
    }
}

2. 列出非 NT 登入帳號


rs->Open("SELECT name FROM master..syslogins WHERE isntname = 0", m_cn, ...);

3. 檢查帳號在特定資料庫的權限


BOOL CUserMgr::HasRight(CString user, CString db) {
    CString sql; sql.Format(_T("SELECT * FROM [%s]..sysusers WHERE name='%s'"), db, user);
    try {
        rs->Open(sql, m_cn, ...); rs->Close(); return TRUE;
    } catch (...) { return FALSE; }
}

4. 新增帳號並授權


void CUserMgr::OnAddUser() {
    if (m_strUser.IsEmpty() || m_strUser == "sa") return;
    if (m_lstUsers.FindStringExact(-1, m_strUser) < 0) {
        m_cn->Execute("sp_addlogin '" + m_strUser + "','" + m_strUser + "'", NULL, adExecuteNoRecords);
        m_lstUsers.AddString(m_strUser);
    }
    CString db; m_cbDatabase.GetLBText(m_cbDatabase.GetCurSel(), db);
    m_cn->PutDefaultDatabase(_bstr_t(db));
    m_cn->Execute("sp_grantdbaccess '" + m_strUser + "'", NULL, adExecuteNoRecords);
    m_lstUserDBs.AddString(db);
}

5. 移除權限 / 刪除帳號


void CUserMgr::OnDel() {
    if (m_lstUserDBs.GetCount() == 0) { // 刪除帳號
        m_cn->Execute("sp_droplogin '" + m_strUser + "'", NULL, adExecuteNoRecords);
        m_lstUsers.DeleteString(m_lstUsers.FindStringExact(-1, m_strUser));
    } else { // 移除特定資料庫權限
        CString db; m_cbDatabase.GetLBText(m_cbDatabase.GetCurSel(), db);
        if (m_lstUserDBs.FindStringExact(-1, db) >= 0) {
            m_cn->PutDefaultDatabase(_bstr_t(db));
            m_cn->Execute("sp_revokedbaccess '" + m_strUser + "'", NULL, adExecuteNoRecords);
            m_lstUserDBs.DeleteString(m_lstUserDBs.FindStringExact(-1, db));
        }
    }
}

連線字串範例


m_cn.Open("Provider=SQLOLEDB;Data Source=.;Initial Catalog=master;User ID=sa;Password=;", "", "", adConnectUnspecified);

安全性建議

  • 生產環境**嚴禁**硬編碼 `sa` 密碼,應使用 Windows 整合驗證或加密配置檔。
  • 所有 `Execute` 應包裝在 `try-catch(_com_error)` 中,記錄錯誤碼與描述。
  • SQL Server 7/2000 已停止支援,建議升級至 2012+ 並改用 `CREATE LOGIN`/`CREATE USER` T-SQL 語法。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved