SQL Server中sys.syslogin中updatedate字段的浅析

在系统视图sys.syslogins中,有createdate与updatedate两个字段,分别表示创建登录名与更新登录名的日期,如果你用updatedate的值来判断一个登录名的权限是否被修改过,那么你就要跳坑里了。当然sys.sysusers视图里面updatedate字段也不能作为某个user权限最后一次修改的依据,如下测试所示:

 

 

USE [master]

GO

CREATELOGIN [kerry] WITHPASSWORD=N'kerry123456',DEFAULT_DATABASE=[AdventureWorks2014],CHECK_EXPIRATION=OFF,CHECK_POLICY=OFF

GO

USE [AdventureWorks2014]

GO

CREATEUSER [kerry] FORLOGIN [kerry]

GO

USE [AdventureWorks2014]

GO

ALTERROLE [db_datareader] ADD MEMBER [kerry]

GO

 

 

 

USEmaster;

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

ALTERROLE [db_datawriter] ADD MEMBER [kerry]

GO

USE [AdventureWorks2014]

GO

ALTERROLE [db_ddladmin] ADD MEMBER [kerry]

GO

 

 

 

 

 

 

 

 

 

USE AdventureWorks2014;

GO

 

SELECT  name ,

      createdate ,

      updatedate

FROM  sys.sysusers

WHERE  name ='kerry';

 

 

 

 

 

 

 

 

当然,如果你修改登录名(login)的SERVER ROLE权限,那么updatedate字段就会变化,如下测试所示

 

ALTERSERVERROLE [processadmin] ADD MEMBER [kerry]

GO

 

 

 

 

 

 

另外测试发现,启用或禁用DISABLE登录名,sys.syslogins中这个字段updatedate的值是会变化的

 

 

 

ALTERLOGIN [kerry] ENABLE

GO

 

ALTERLOGIN [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)

ORDERBY trcdata.StartTime

                 --trcdata.DatabaseID

                 --trcdata.TargetLoginName

 

 

 

 

 

 

 

参考资料:

https://msdn.microsoft.com/zh-cn/library/ms178593.aspx

https://msdn.microsoft.com/zh-cn/library/ms179871.aspx

时间: 2024-09-27 12:08:46

SQL Server中sys.syslogin中updatedate字段的浅析的相关文章

SQL Server数据库的存储过程中定义的临时表,真的有必要显式删除(drop table #tableName)吗?

原文:SQL Server数据库的存储过程中定义的临时表,真的有必要显式删除(drop table #tableName)吗?   本文出处:http://www.cnblogs.com/wy123/p/6704619.html      问题背景 在写SQL Server存储过程中,如果存储过程中定义了临时表,有些人习惯在存储过程结束的时候一个一个显式地删除过程中定义的临时表(drop table #tName),有些人又没有这个习惯,对于不明真相的群众或者喜欢思考的人会问,存储过程中定义的临

无法在 SQL Server 2005 Manger Studio 中录入中文的

问题表现:在 SQL Server 2005 Manger Studio中打开表,无法输入中文,只能输入英文 问题重现:1. 我们建立如下三个测试表:CREATE TABLE ta(    id int IDENTITY,    col varchar(50)) CREATE TABLE tb(    col varchar(50),    id int IDENTITY) CREATE TABLE tc(    col1 varchar(50),    col2 as col1) 2. 在SQ

数据存储-sql server在同一表中筛选出两次刷卡记录时间大于等于40分钟的员工数据

问题描述 sql server在同一表中筛选出两次刷卡记录时间大于等于40分钟的员工数据 刷卡进出数据存储在同一表中,姓名有重复的,一个人可能刷了2次,要求选出在时间段2014-12-28 11:00:00到2014-12-28 13:00:00内两次刷卡记录时间间隔大于等于40分钟的员工 logtime (时间 )logcard (卡号 )logid () logname(姓名) logbm (部门) 解决方案 ```select * from 同一表 a where logtime betw

sql service-如何获得LDAP的目录(部门信息),并插入SQL SERVER的部门表中?请贴上相关代码

问题描述 如何获得LDAP的目录(部门信息),并插入SQL SERVER的部门表中?请贴上相关代码 已经连接上了,但是不知道怎么获取里面的数据,比如部门信息和用户信息,都不知道怎么获取,求大神帮帮忙,非常感谢

SET STATISTICS IO和SET STATISTICS TIME 在SQL Server查询性能优化中的作用

原文:SET STATISTICS IO和SET STATISTICS TIME 在SQL Server查询性能优化中的作用 近段时间以来,一直在探究SQL Server查询性能的问题,当然也漫无目的的查找了很多资料,也从网上的大神们的文章中学到了很多,在这里,向各位大神致敬.正是受大神们无私奉献精神的影响,所以小弟也作为回报,分享一下关于SET STATISTICS IO和SET STATISTICS TIME这两条T_SQL命令,在查询优化性能中的作用.       首先我想说明一下这篇文章

sqlserver-关系型数据库(sql server, oracle, mysql)中的数据Load到HBasez中

问题描述 关系型数据库(sql server, oracle, mysql)中的数据Load到HBasez中 我现在的数据是在关系型数据库(如sql server, oracle, mysql)中,且主键为复合主键,我现在想把这些数据导入到HBase中该怎么做啊?各位大神帮帮忙啊 解决方案 用Kettle抽数工具,很方便支持各种数据库之间的数据转换 解决方案二: 试试这个 数据抽取工具V3.0 http://download.csdn.net/detail/haonengbao/766908

SQL点滴12—SQL Server备份还原数据库中的小把戏

原文:SQL点滴12-SQL Server备份还原数据库中的小把戏 备份数据库时出现一个不太了解的错误 ,错误信息"is formatted to support  1 media families, but 2 media families are expected according to the backup device specification".如下图: 解决办法是首先选中击上一次备份的文件,点击Remove,去掉当前的备份文件,然后再点击OK备份.这样才能正确的备份.也

在SQL Server的数据存储中与NTFS簇大小有关

NTFS是Windows NT以及之后的Windows 2000.Windows XP.Windows Server 2003.Windows Server 2008.Windows Vista和Windows 7的标准文件系统.NTFS取代了文件分配表(FAT)文件系统,为Microsoft的Windows系列操作系统提供文件系统.NTFS对FAT和HPFS(高性能文件系统)作了若干改进,例如,支持元数据,并且使用了高级数据结构,以便于改善性能.可靠性和磁盘空间利用率,并提供了若干附加扩展功能

sql server建表时设置ID字段自增的简单方法

打开要设置的数据库表,点击要设置的字段,比如id,这时下方会出现id的列属性表 列属性中,通过设置"标识规范"的属性可以设置字段自增,从下图上看,"是标识"的值是否,说明id还不是自增字段 能够设置ID字段自增的字段必须是可自增的,比如int,bigint类型,而varchar类型是不可自增的.比如查看name的列属性时,可以看到"是标识"是否且不可更改. 点击"标识规范",展开后,点击"是标识"会出现下拉