Sql-Server-2014

允許使用者在伺服器上創建數據庫,並且只查看他創建的數據庫,而無需先創建登錄

  • January 23, 2021

我想使用 C# 應用程序和 MS SQL Server Express 2014 實現以下案例。我有一個集中式數據庫伺服器,其中已經創建了一些數據庫(具有相同的表)。在我的 c# 應用程序中,我希望允許使用者創建數據庫(格式相同但名稱不同),並且使用者可以分配其他使用者訪問新創建的數據庫。此外,我想確保在第一次使用 c# 應用程序時,使用者將無法從伺服器地址看到任何數據庫。只有在他執行“創建數據庫”按鈕後,他才能看到他之前創建的數據庫。當其他使用者將獲得對某個數據庫的訪問權時,也會發生同樣的事情。

所以一個例子可以是:假設你在 sql server xyz 中有 3 個數據庫(A,B,C)。現在使用者 AA 打開 c# 應用程序,在可用數據庫列表中他什麼也看不到,因此它創建了一個新的 db1。之後 db1 出現在列表中。然後他將使用者 AB、AC 分配給 db1。現在AB、AC也可以看到db1了。AA、AB、AC 不得通過 SSMS 訪問 db1 數據庫。

到目前為止我已經嘗試過:

  1. 我已將筆記型電腦配置為遠端 MS SQL Express 2014。
  2. 使用 SSMS 我首先創建一個登錄名,然後我拒絕查看任何數據庫,之後我只允許訪問某些數據庫

.

USE [master]
GO

CREATE LOGIN [xx] FROM WINDOWS WITH DEFAULT_DATABASE=[master], DEFAULT_LANGUAGE=[us_english]
GO

– 第二步:(拒絕查看任何數據庫)

USE master;
GO
DENY VIEW ANY DATABASE TO [xx]; 

 – 步驟 3(然後授權該特定數據庫的使用者,您必須通過使用 master 來使用 master,如下所示)

USE master;
GO
ALTER AUTHORIZATION ON DATABASE::DB1 TO [xx];
GO

現在我不知道是否可以允許在伺服器上創建數據庫並將使用者映射到數據庫而不先創建登錄名。另外我不知道如何限制 SSMS 使用的訪問。

您應該使用每個使用者所屬的Active Directory 組(例如),而不是為每個使用者進行登錄,並直接在該****AD 組或您可以為該AD 組創建的****角色上分配權限。然後你只需要一次。DOMAIN USERS``DENY VIEW ANY DATABASE

然後,當您的使用者通過您的應用程序創建數據庫時,您就可以為該使用者和數據庫執行CREATE LOGIN(如果不存在)和ALTER AUTHORIZATION ON DATABASE腳本。

這樣做的好處是您的所有使用者將無法自動訪問任何不屬於他們自己的數據庫,即使通過 SSMS 也是如此。您還可以將新登錄名的預設數據庫設置為他們創建的第一個數據庫,並設置適當的權限,例如賦予他們db_owner角色。

我在考慮應用程序角色,但您必須在數據庫中創建它們,所以它不起作用,因為您需要創建數據庫的權利。(應用角色

但是,您可以執行登錄觸發器來阻止通過 SSMS 的連接。以下是如何使用登錄觸發器限制 SQL Server 登錄身份驗證範圍這樣,您創建了一個有權創建數據庫的登錄,但由於登錄觸發器,它無法通過 SSMS 連接。

這是登錄觸發器的其他範例

要知道哪些使用者創建了哪些數據庫,您可以使用這樣的查詢。

SELECT s.name as DatabaseName, sl.name as OwnerName 
FROM sys.databases s
JOIN sys.sql_logins sl ON sl.sid=s.owner_sid

引用自:https://dba.stackexchange.com/questions/283802