【问题标题】:Getting last updated on a table as a dbowner作为 dbowner 获取表的最后更新
【发布时间】:2011-05-06 23:41:22
【问题描述】:

我需要获取表格的最后更新时间戳。此操作将由对所有存储过程具有 GRANT EXEC 权限的 dbowner 执行。任何想法如何做到这一点?这是我尝试过的。

我尝试使用 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;
}

也尝试创建一个新的存储过程,但是当我调用它时,我得到了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

【问题讨论】:

    标签: sql tsql sql-server-2008 smo


    【解决方案1】:

    来自sys.dm_db_index_usage_stats 的帮助主题:

    需要查看服务器状态权限。

    如果您查看server permissionsVIEW SERVER STATEALTER SERVER STATE 隐含,而CONTROL SERVER 又由CONTROL SERVER 隐含。系统管理员拥有所需的权限,而数据库管理员则没有。

    最好的解决方案是对程序进行签名,然后通过签名授予所需的权限,例如Signing an activated procedure

    【讨论】:

    • 感谢您的回答。在我看来,您提出的解决方案对于“上次修改表的时间”这样一个简单的问题来说太复杂了。有没有更简单的提取这条数据的解决方案?
    猜你喜欢
    • 1970-01-01
    • 2016-11-13
    • 1970-01-01
    • 2020-07-10
    • 2014-05-09
    • 2013-12-17
    • 2021-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多