SQL Server中sys.syslogin中updatedate字段的浅析
栏目: 数据库 · SQL Server · 发布时间: 6年前
内容简介:SQL Server中sys.syslogin中updatedate字段的浅析
在系统视图sys.syslogins中,有createdate与updatedate两个字段,分别表示创建登录名与更新登录名的日期,如果你用updatedate的值来判断一个登录名的权限是否被修改过,那么你就要跳坑里了。当然sys.sysusers视图里面updatedate字段也不能作为某个user权限最后一次修改的依据,如下测试所示:
USE [master]
GO
CREATE LOGIN [kerry] WITH PASSWORD = N'kerry123456' , DEFAULT_DATABASE = [AdventureWorks2014] , CHECK_EXPIRATION = OFF , CHECK_POLICY = OFF
GO
USE [AdventureWorks2014]
GO
CREATE USER [kerry] FOR LOGIN [kerry]
GO
USE [AdventureWorks2014]
GO
ALTER ROLE [db_datareader] ADD MEMBER [kerry]
GO
USE master ;
GO
SELECT name ,
createdate ,
updatedate ,
accdate ,
dbname
FROM sys . syslogins
WHERE name = 'kerry' ;
如下截图所示,sys.syslogins中,name为kerry的这条记录的createdate与updatedate字段值为2017-06-07 11:45:48:527,就是我创建该登录名的时间。
USE AdventureWorks2014 ;
GO
SELECT name ,
createdate ,
updatedate
FROM sys . sysusers
WHERE name = 'kerry' ;
sys.sysusers 中的 name 为 kerry 的这条记录的 createdate 与 updatedate 字段值也是同一个值。如下所示:
我们修改kerry的权限,发现sys.syslogins和sys.sysusers中updatedate字段的值均没有变化
USE [AdventureWorks2014]
GO
ALTER ROLE [db_datawriter] ADD MEMBER [kerry]
GO
USE [AdventureWorks2014]
GO
ALTER ROLE [db_ddladmin] ADD MEMBER [kerry]
GO
USE AdventureWorks2014 ;
GO
SELECT name ,
createdate ,
updatedate
FROM sys . sysusers
WHERE name = 'kerry' ;
当然,如果你修改登录名(login)的SERVER ROLE权限,那么updatedate字段就会变化,如下测试所示
ALTER SERVER ROLE [processadmin] ADD MEMBER [kerry]
GO
另外测试发现,启用或禁用DISABLE登录名,sys.syslogins中这个字段updatedate的值是会变化的
ALTER LOGIN [kerry] ENABLE
GO
ALTER LOGIN [kerry] DISABLE
GO
这里就不研究sys.sysusers在什么条件下会触发updatedate字段会更新。 那么如何查看某个账号的权限被变跟过呢? 这个只能用触发器或开启审计,当然也可以用下面脚本,但是这个是有 很强的 时效性的 。
DECLARE @tracefile VARCHAR ( 500 )
-- Get path of default trace file
SELECT @tracefile = CAST ( value AS VARCHAR ( 500 ))
FROM :: fn_trace_getinfo ( DEFAULT )
WHERE traceid = 1
AND property = 2
-- Get security changes from the default trace
SELECT *
FROM :: fn_trace_gettable ( @tracefile , DEFAULT ) trcdata -- DEFAULT means all trace files will be read
INNER JOIN sys . trace_events evt ON trcdata . EventClass = evt . trace_event_id
WHERE trcdata . EventClass IN ( 102 , 103 , 104 , 105 , 106 , 108 , 109 , 110 , 111 )
ORDER BY trcdata . StartTime
--trcdata.DatabaseID
--trcdata.TargetLoginName
参考资料:
https://msdn.microsoft.com/zh-cn/library/ms178593.aspx
https://msdn.microsoft.com/zh-cn/library/ms179871.aspx
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- springboot~DTO字符字段与日期字段的转换问题
- Protocol Buffers 学习(2):字段类型和其他语言字段类型之间的映射
- Protocol Buffers 学习(2):字段类型和其他语言字段类型之间的映射
- PHPRAP 2.0.2 发布,接口和字段数据分离,字段使用单独数据表
- 如何正确新增字段
- HTTP缓存字段总结
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。