在设置权限前,需完成SQL Server在Ubuntu上的安装与基础配置:
curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://packages.microsoft.com/ubuntu/20.04/mssql-server-2022 main"
sudo apt-get update && sudo apt-get install -y mssql-server
sudo /opt/mssql/bin/mssql-conf setup,按提示设置SA账户密码(系统管理员账户,权限最高)及SQL Server版本(如2022)。sudo systemctl start mssql-server && sudo systemctl status mssql-server
以上步骤完成后,SQL Server将在Ubuntu上运行,为后续权限设置奠定基础。
权限管理需遵循“服务器层→数据库层→对象层”的分层逻辑,确保权限粒度可控。
登录名是用户访问SQL Server实例的身份凭证,适用于跨数据库访问。
使用sqlcmd工具连接SQL Server(需替换YourPassword为强密码):
sqlcmd -S localhost -U SA -P 'YourPassword'
在sqlcmd中执行以下命令创建登录名:
CREATE LOGIN [YourLoginName] WITH PASSWORD = 'YourStrongPassword';
GO
说明:
YourLoginName:自定义登录名(如dev_user);登录名需关联到具体数据库才能访问数据,需在目标数据库中创建数据库用户。
USE [YourDatabaseName]; -- 切换到目标数据库(如`SalesDB`)
GO
CREATE USER [YourUserName] FOR LOGIN [YourLoginName];
GO
说明:
YourUserName:数据库内的用户标识(通常与登录名一致);SQL Server提供固定数据库角色,可快速分配常用权限,避免逐个授权。常见角色及权限:
| 角色名称 | 权限说明 |
|---|---|
db_owner |
拥有数据库所有权限(慎用,仅授予管理员) |
db_datareader |
可读取数据库内所有表的数据 |
db_datawriter |
可向数据库内所有表插入、更新、删除数据 |
db_ddladmin |
可执行数据定义语言(DDL)操作(如CREATE/ALTER/DROP表) |
分配角色命令:
ALTER ROLE [db_datareader] ADD MEMBER [YourUserName];
ALTER ROLE [db_datawriter] ADD MEMBER [YourUserName];
GO
说明:
ALTER ROLE将用户添加到角色中,替代旧版的sp_addrolemember(部分新版本已弃用)。若需更细粒度的权限(如限制用户仅能访问某张表的特定操作),可使用GRANT语句。
示例:授予用户对Orders表的SELECT(查询)和INSERT(插入)权限:
USE [YourDatabaseName];
GO
GRANT SELECT, INSERT ON [dbo].[Orders] TO [YourUserName];
GO
说明:
[dbo].[Orders]:目标对象(dbo为架构名,Orders为表名);SELECT、INSERT、UPDATE、DELETE、EXECUTE(存储过程)等。db_datareader,无需db_owner)。sys.database_principals视图查看用户权限)。CREATE ROLE [OrderManager],然后分配SELECT、INSERT权限)。EXEC sp_configure 'password policy', 1;
RECONFIGURE;
ufw配置):sudo ufw allow from Trusted_IP to any port 1433/tcp
sudo ufw reload
以上实践可有效降低权限滥用风险,提升SQL Server安全性。
最后,需通过实际登录验证权限是否生效:
sqlcmd -S localhost -U YourLoginName -P 'YourStrongPassword' -d YourDatabaseName
连接后,尝试执行以下操作:
SELECT * FROM Orders;(应成功,若授予了SELECT权限);INSERT INTO Orders (OrderID, CustomerName) VALUES (1, 'John');(应成功,若授予了INSERT权限);DELETE FROM Orders;(应失败,若未授予DELETE权限)。通过验证可确保权限设置符合预期。