sql-server - T-SQL 获取 SQL Server 2012 中登录角色的信息
问题描述
我是 SQL Server 的新手。我创建了一个数据库并在我的数据库角色中添加了 3 个角色:
- 学校:数据阅读器
- 品牌:数据所有者
- 教师:数据阅读器,数据写入器
然后我创建了一个存储过程,它将添加一个登录帐户来访问 SQL Server:
ALTER PROC [dbo].[sp_CreateLogin]
@LGNAME VARCHAR(50),
@PASS VARCHAR(50),
@USERNAME VARCHAR(50),
@ROLE VARCHAR(50)
AS
BEGIN
DECLARE @RET INT
EXEC @RET = SP_ADDLOGIN @LGNAME, @PASS,'mydatabase'
IF (@RET =1) -- LOGIN NAME EXIST
RETURN 1
EXEC @RET = SP_GRANTDBACCESS @LGNAME, @USERNAME
IF (@RET =1) -- USER NAME EXIST
BEGIN
EXEC SP_DROPLOGIN @LGNAME
RETURN 2
END
EXEC sp_addrolemember @ROLE, @USERNAME
IF @ROLE = 'SCHOOL'
BEGIN
EXEC sp_addsrvrolemember @LGNAME, 'sysadmin'
EXEC sp_addsrvrolemember @LGNAME, 'SecurityAdmin'
EXEC sp_addsrvrolemember @LGNAME, 'ProcessAdmin'
END
IF @ROLE = 'BRAND'
BEGIN
EXEC sp_addsrvrolemember @LGNAME, 'sysadmin'
EXEC sp_addsrvrolemember @LGNAME, 'SecurityAdmin'
EXEC sp_addsrvrolemember @LGNAME, 'ProcessAdmin'
END
IF @ROLE= 'TEACHER'
BEGIN
EXEC sp_addsrvrolemember @LGNAME, 'ProcessAdmin'
END
END
现在,我想创建一个存储过程来检查 LoginName ( @LGNAME
) 是否已经作为登录帐户存在。如果存在,则返回用户名 ( @USERNAME
) 和角色 ( @ROLE
)。
我可以检查是否LoginName
存在,但我不知道如何获取用户名和角色。
解决方案
您的代码完全错误。
你为什么这么认为IF (@RET =1) -- LOGIN NAME EXIST
?
您可能会收到任何其他错误,例如您提供空密码或弱密码并获取
消息 15116,级别 16,状态 1,第 16 行密码验证失败。密码太短,不符合 Windows 策略要求。
那你不了解服务器角色,至少,sysadmin
角色。你说
I create a database and added 3 role in my database roles:
SCHOOL: datareader
BRAND: dataowner
TEACHER: datareader, datawriter
然后你的代码会:
IF @ROLE = 'SCHOOL'
BEGIN
EXEC sp_addsrvrolemember @LGNAME, 'sysadmin'
EXEC sp_addsrvrolemember @LGNAME, 'SecurityAdmin'
EXEC sp_addsrvrolemember @LGNAME, 'ProcessAdmin'
END
所以你希望的成员SCHOOL
是 only db_datareader
?但是你给了他们sysadmin
服务器角色。这意味着不仅不需要将它们添加为 and 的成员,
SecurityAdmin
而且ProcessAdmin
不需要创建它们,db_datareader
因为这些登录已经拥有服务器上所有可能的权限。
我认为你应该从学习SQL Server
固定开始server roles
,至少你应该明白,sysadmin
不仅不需要任何permission
东西,也没有任何deny
办法sysadmin
。所以你不应该给sysadmin
任何人,这个登录可以删除你的数据库并将你排除在sysadmin
.
我可以检查 LoginName 是否存在,但我不知道如何获取用户名和角色
要查找相应的用户,您可以使用以下代码:
select name
from sys.database_principals
where suser_sname(sid) = 'your_login';
要检查它是否是角色成员,请检查IS_ROLEMEMBER ('your_role','your_user')
它是否返回 1your_user
是your_role
.
推荐阅读
- python - 如何在不使用 Django 默认登录表单的情况下登录?
- php - 根据 Woocommerce 购物车中超过 40 欧元的产品数量添加运费。额外费用因运送国家而异
- python - 查找列表中的连续项目
- mongodb - 为什么 MongoDB compact 命令会增加集合的大小?
- javascript - 如何在我的 node.js 中使用地理位置来获取用户设备的纬度/经度
- python - 最小化的基于 Tkinter 的程序中的热键
- regex - 如何制作正则表达式来验证用户名
- c++ - 在 C++ 中的函数参数中使用任何类型
- javascript - 如何使用 JavaScript 在每行的开头和结尾添加文本
- python - 求解齐次坐标 (x,y,z,w) 中两个 3D 向量的叉积