我需要为表格获取上次更新的时间戳。此操作由dbowner执行,该dbowner对所有sprocs具有GRANT EXEC权限。任何想法如何实现这一目标?这是我试过的。
我尝试使用SMO获取此信息,但由于缺少权限,它会返回一个空表对象。
using (SqlConnection connection = new SqlConnection(connectionString))
{
ServerConnection serverConnection = new ServerConnection(connection);
Server server = new Server(serverConnection);
Database database = server.Databases["MyDb"];
Table table = database.Tables["MyTable"]; // here table is null for dbowner user, but a valid object for a super user
DateTime lastModified = table.DateLastModified;
}
还尝试创建一个新的sproc,但是当我调用它时,我得到The user does not have permission to perform this action.
CREATE PROCEDURE getTableLastModifiedDate
(
@TableName nvarchar(max)
)
AS
BEGIN
SELECT last_user_update FROM sys.dm_db_index_usage_stats
WHERE OBJECT_NAME(OBJECT_ID)=@TableName AND database_id = DB_ID(DB_NAME())
END
GO
答案 0 :(得分:2)
来自sys.dm_db_index_usage_stats
的帮助主题:
需要VIEW SERVER STATE权限。
如果您查看server permissions VIEW SERVER STATE
,ALTER SERVER STATE
隐含CONTROL SERVER
隐含{{1}}。系统管理员具有所需的权限,而数据库管理员则没有。
最佳解决方案是签署程序,然后通过签名授予所需的权限,请参阅Signing an activated procedure以获取示例。