📄 grantprivilegesforsdeuser.cpp
字号:
// GrantPrivilegesForSDEUser.cpp: implementation of the GrantPrivilegesForSDEUser class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "yhgl.h"
#include "GrantPrivilegesForSDEUser.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
#include <iostream.h>
CString DBSDE::server;
CString DBSDE::instance;
CString DBSDE::database;
CString DBSDE::user;
CString DBSDE::password;
CString DBSDE::version;
IWorkspacePtr DBSDE::g_pSDEWorkspace;
IWorkspacePtr getSDEWorkspace(LPCTSTR server,LPCTSTR instance,LPCTSTR database,LPCTSTR user,LPCTSTR password,LPCTSTR version)
{
//===================== 建立SDE数据库 ======================
IWorkspaceFactoryPtr pSDEWSF(CLSID_SdeWorkspaceFactory);
IPropertySetPtr pPropset(CLSID_PropertySet);
IWorkspacePtr pWorkspace;
CComVariant vserver(server);
CComVariant vinstance(instance);
CComVariant vdatabase(database);
CComVariant vuser(user);
CComVariant vpassword(password);
CComVariant vversion(L"sde.DEFAULT");
//打开SDE数据库的workspace
pPropset->SetProperty (L"Server", vserver);
pPropset->SetProperty (L"Instance", vinstance);
pPropset->SetProperty (L"Database", vdatabase);
pPropset->SetProperty (L"user", vuser);
pPropset->SetProperty (L"password", vpassword);
pPropset->SetProperty (L"version", vversion);
HRESULT hr = pSDEWSF->Open (pPropset,0L,&pWorkspace);
if (!SUCCEEDED(hr))
{
AfxMessageBox("不能获得相应的SDE数据库!");
return NULL;
}
return pWorkspace;
}
//登陆时将SDE的登陆注册信息存储到静态变量,以便后续使用
void DBSDE::InitSDELoginSetting (LPCTSTR s,LPCTSTR ins,LPCTSTR db,LPCTSTR user,LPCTSTR pwd,LPCTSTR ver)
{
DBSDE::server = s;
DBSDE::instance = ins;
DBSDE::database = db;
DBSDE::user = user;
DBSDE::password = pwd;
DBSDE::version = ver;
}
BOOL DBSDE::IsSDEConnected()
{
return !(DBSDE::g_pSDEWorkspace == NULL);
}
// grantPrivileges: grant or revoke privileges on an object in a workspace
//
IWorkspacePtr DBSDE::ConnectSDE()
{
return DBSDE::g_pSDEWorkspace = getSDEWorkspace (DBSDE::server,DBSDE::instance,DBSDE::database,DBSDE::user,DBSDE::password,DBSDE::version);
}
//设置用户权限
//targetuser是需要设置的用户名 owner是拥有较高权限的用户名
//dataset需要设置的数据集
//privs = "1"只读 "2"读写
BOOL GrantPrivileges(LPCTSTR targetuser, LPCTSTR dataset, LPCTSTR privs, LPCTSTR owner, IWorkspace * pInWorkspace)
{
if (pInWorkspace == 0) return FALSE;
CString dscode(dataset);
//过滤数据集代码,目前只支持矢量数据集
TCHAR dsClassTag;
dsClassTag = dscode[7];
if (dsClassTag != '1') return TRUE;
HRESULT hr;
IEnumDatasetNamePtr ipDSNames;
IDatasetNamePtr ipDatasetName;
ISQLPrivilegePtr ipSQLPriv;
ISchemaLockPtr ipSLock;
INamePtr ipName;
IDatasetPtr ipDataset;
IUnknownPtr ipUnknown;
CComBSTR bsName;
// UCase everthing for string comparison
CComBSTR bsUser(targetuser);
CComBSTR bsPrivs(privs);
CComBSTR bsOwer(owner);
bsOwer.Append(".");
bsOwer.Append(dataset);
bsOwer.ToUpper();
if (FAILED(hr = pInWorkspace->get_DatasetNames(esriDTAny, &ipDSNames)))
return FALSE;
// get an enumeration of all of the datasets in the workspace and grant/revoke on the one specfied
while (ipDSNames->Next(&ipDatasetName) == S_OK)
{
ipDatasetName->get_Name(&bsName);
bsName.ToUpper();
if (bsName == bsOwer)
{
// get a schema lock
ipName = ipDatasetName;
ipName->Open(&ipUnknown);
ipDataset = ipUnknown;
ipSLock = ipDataset;
if (FAILED(hr = ipSLock->ChangeSchemaLock(esriExclusiveSchemaLock)))
return hr;
// revoke everything
ipSQLPriv = ipDatasetName;
hr = ipSQLPriv->Revoke(bsUser, esriDeletePrivilege);
if (hr != 0 && hr != -2147216018) return FALSE;
hr = ipSQLPriv->Revoke(bsUser, esriUpdatePrivilege);
if (hr != 0 && hr != -2147216018) return FALSE;
hr = ipSQLPriv->Revoke(bsUser, esriInsertPrivilege);
if (hr != 0 && hr != -2147216018) return FALSE;
hr = ipSQLPriv->Revoke(bsUser, esriSelectPrivilege);
if (hr != 0 && hr != -2147216018) return FALSE;
// now do the grant
if (bsPrivs == _T("2"))
{
if (FAILED(hr = ipSQLPriv->Grant(bsUser,esriSelectPrivilege,VARIANT_FALSE)))
return FALSE;
if (FAILED(hr = ipSQLPriv->Grant(bsUser,esriUpdatePrivilege,VARIANT_FALSE)))
return FALSE;
if (FAILED(hr = ipSQLPriv->Grant(bsUser,esriInsertPrivilege,VARIANT_FALSE)))
return FALSE;
if (FAILED(hr = ipSQLPriv->Grant(bsUser,esriDeletePrivilege,VARIANT_FALSE)))
return FALSE;
}
else if (bsPrivs == _T("1"))
{
if (FAILED(hr = ipSQLPriv->Grant(bsUser,esriSelectPrivilege,VARIANT_FALSE)))
return FALSE;
}
if (FAILED(hr = ipSLock->ChangeSchemaLock(esriSharedSchemaLock)))
return FALSE;
return TRUE;
}
}
return FALSE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -