Последнее обновление таблицы на dbowner - PullRequest
2 голосов
/ 07 мая 2011

Мне нужно получить последнюю обновленную метку времени для таблицы.Эта операция должна быть выполнена владельцем dbowner, у которого есть разрешения GRANT EXEC для всех sprocs.Есть идеи, как это сделать?Вот что я пытался.

Я пытался получить эту информацию с помощью 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

1 Ответ

2 голосов
/ 07 мая 2011

Из раздела справки для sys.dm_db_index_usage_stats:

Требуется разрешение VIEW SERVER STATE.

Если вы посмотрите на разрешения сервера : VIEW SERVER STATE подразумевается ALTER SERVER STATE, в свою очередь подразумевается CONTROL SERVER. Системные администраторы имеют необходимые разрешения, а администраторы баз данных - нет.

Лучшее решение - подписать процедуру, а затем предоставить требуемое разрешение через подпись, см. Подписание активированной процедуры , например.

...