在没有权限运行 Exec sp_updatestats 时,用这个存储过程来更新数据库中所有表的统计信息


GO
/****** Object:  StoredProcedure [dbo].[mysp_updatestats]    Script Date: 2023/6/7 15:02:17 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

-- 在没有权限运行 Exec sp_updatestats 时,用这个存储过程来更新数据库中所有表的统计信息
-- 当前采用的是 UPDATE STATISTICS [dbo].[mytablename]  WITH FULLSCAN 的方式
-- 作者:huang wanjing
-- 执行方式: exec [mysp_updatestats]
create procedure [dbo].[mysp_updatestats]

as

	-- required so it can update stats on ICC/IVs
	set ansi_warnings on
	set ansi_padding on
	set arithabort on
	set concat_null_yields_null on
	set numeric_roundabort off

	declare @exec_stmt_head nvarchar(4000)	-- "UPDATE STATISTICS [sysname].[sysname] "

	declare @updated_count int
	declare @skipped_count int

	declare @sch_id int
	declare @schema_name sysname
	declare @table_name sysname
	declare @table_id int
	declare @table_type char(2)
	declare @schema_table_name nvarchar(640) -- assuming sysname is 128 chars, 5x that, so it's > 128*4+4

	--declare @compatlvl tinyint

	declare ms_crs_tnames cursor local fast_forward read_only for
		select name, object_id, schema_id, type from sys.objects o
		where o.type = 'U' --### or o.type = 'IT'
	open ms_crs_tnames
	fetch next from ms_crs_tnames into @table_name, @table_id, @sch_id, @table_type


	while (@@fetch_status <> -1) -- fetch successful
	begin
		-- generate fully qualified quoted name
		select @schema_name = schema_name(@sch_id)
		select @schema_table_name = quotename(@schema_name, '[') +'.'+ quotename(rtrim(@table_name), '[')

		-- check for table with disabled clustered index
		if (1 = isnull((select is_disabled from sys.indexes where object_id = @table_id and index_id = 1), 0))
		begin
			-- raiserror('Table ''%s'': cannot perform the operation on the table because its clustered index is disabled', -1, -1, @tablename)
			raiserror(15654, -1, -1, @schema_table_name)
		end
		else
		begin
			--print @schema_table_name
			-- filter out local temp tables and Hekaton tables
			-- Note that OBJECTPROPERTY returns NULL on type="IT" tables, thus we only call it on type='U' tables
			if ((@@fetch_status <> -2) and 
			   (substring(@table_name, 1, 1) <> '#'))  -- temp tables
			   --and ((@table_type<>'U') or (0 = OBJECTPROPERTY(@table_id, 'TableIsInMemory'))))	-- Hekaton tables
			begin
				-- reset counters for this table
				select @updated_count = 0
				select @skipped_count = 0

				-- print status message
				--raiserror('Updating %s', -1, -1, @schema_table_name)
				--raiserror(15650, -1, -1, @schema_table_name)

				-- initial statement preparation: UPDATE STATISTICS [schema].[name]
				select @exec_stmt_head = 'UPDATE STATISTICS ' + @schema_table_name + '  WITH FULLSCAN'
				print @exec_stmt_head
				exec (@exec_stmt_head)
			end
		end
		print ' '
		fetch next from ms_crs_tnames into @table_name, @table_id, @sch_id, @table_type
	end
	raiserror(15005,-1,-1)
	deallocate ms_crs_tnames
	return(0) -- mysp_updatestats

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
"教学管理系统TM"可能不是一个具体的数据库管理系统,因此我无法提供特定于该系统的答案。不过,通常来说,在任何一个数据库管理系统,您都可以使用CREATE USER语句和存储过程sp_grantdbaccess来创建数据库用户和授予用户访问数据库权限。 具体来说,您可以使用CREATE USER语句来创建一个新用户,该语句的语法如下: ``` CREATE USER user_name [ FOR | FROM login_name ] ``` 其,user_name是您要创建的新用户的名称,login_name是您要从创建新用户的现有登录名。例如,以下语句将创建一个名为"testuser"的新用户,并将其从现有登录名"testlogin"创建: ``` CREATE USER testuser FROM testlogin; ``` 要授予用户对数据库的对象的访问权限,您可以使用GRANT语句。例如,以下语句将授予"testuser"用户对"mytable"的SELECT权限: ``` GRANT SELECT ON mytable TO testuser; ``` 另一方面,如果您想使用存储过程sp_grantdbaccess来更灵活地控制用户的权限,您可以使用以下语法: ``` EXEC sp_grantdbaccess @loginame = 'login_name', @name_in_db = 'user_name' ``` 其,login_name是您要添加到数据库的登录名,user_name是您要为该用户指定的数据库用户名称。例如,以下语句将创建一个名为"testuser"的新用户,并使用现有的登录名"testlogin": ``` EXEC sp_grantdbaccess @loginame = 'testlogin', @name_in_db = 'testuser' ``` 要授予该用户对数据库特定对象的权限,可以使用GRANT语句。例如,以下语句将授予"testuser"用户对"mytable"的SELECT权限: ``` GRANT SELECT ON mytable TO testuser; ``` 请注意,具体语法可能因数据库管理系统而异。因此,我建议您查阅您所使用的数据库管理系统的文档,以了解更多详细信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值