【发布时间】:2021-11-01 18:20:39
【问题描述】:
看起来我的代码应该可以工作,但是测试表明内部游标的所有结果都基于脚本执行时的当前数据库,而不依赖于脚本中的 USE 语句。 我忘记了什么?
DECLARE @Debug BIT = 1
DECLARE @newgrp VARCHAR(100) = 'ChangeTrakingViewableRole'
DECLARE @obj VARCHAR(100)
DECLARE @tsql VARCHAR(900)
DECLARE @tsql2 VARCHAR(900)
DECLARE @msg VARCHAR(900)
DECLARE @SchName VARCHAR(55)
DECLARE @TblName sysname
IF @Debug = 'TRUE' PRINT 'Debuging ON'
IF COALESCE(@newgrp,'') = ''
BEGIN
PRINT 'There was no DatabaseRole, User or Group Specified to take the place of the Public Role'
SET NOEXEC ON
END
ELSE
BEGIN
DECLARE DbCursor CURSOR FOR
SELECT 'USE '+DB_NAME(database_id) FROM sys.change_tracking_databases
OPEN DbCursor
FETCH NEXT FROM DbCursor INTO @obj
WHILE @@Fetch_Status = 0
BEGIN
SET @tsql2 = @obj+'; '
RAISERROR (@tsql2, 0, 1) WITH NOWAIT
EXEC sp_sqlexec @tsql2
-----------Commands within this next section are all database dependent
BEGIN --GRANT [VIEW CHANGE TRACKING] TO Change Tracking Enabled Tables
IF NOT EXISTS (SELECT name FROM sys.database_principals where name = @newgrp)
BEGIN
SET @tsql = N'CREATE ROLE '+@newgrp+' AUTHORIZATION [dbo]'
IF @Debug = 'TRUE'
BEGIN
SET @Msg = @tsql
RAISERROR (@Msg, 0, 1) WITH NOWAIT
END
ELSE
BEGIN
EXEC sp_sqlexec @tsql
END
END
DECLARE TblCursor CURSOR FOR
SELECT sch.name, tbl.name
FROM sys.change_tracking_tables chg
JOIN sys.tables tbl ON chg.object_id=tbl.object_id
JOIN sys.schemas sch ON tbl.schema_id=sch.schema_id
ORDER BY sch.name, tbl.name
OPEN TblCursor
FETCH NEXT FROM TblCursor INTO @SchName,@TblName
WHILE @@FETCH_STATUS = 0
BEGIN
SET @tsql = 'GRANT VIEW CHANGE TRACKING ON ['+@SchName+'].['+@TblName+'] TO '+@newgrp
IF @Debug = 'TRUE'
BEGIN
SET @Msg = @tsql
RAISERROR (@Msg, 0, 1) WITH NOWAIT
END
ELSE
BEGIN
EXEC sp_sqlexec @tsql
END
FETCH NEXT FROM TblCursor INTO @SchName,@TblName
END
CLOSE TblCursor
DEALLOCATE TblCursor
END
FETCH NEXT FROM DbCursor INTO @obj
END
CLOSE DbCursor
DEALLOCATE DbCursor
END
【问题讨论】:
-
我应该怎么做才能让我的帖子保留我发布时的格式并使其在 squillman 重新格式化后看起来像现在一样?
-
我所做的只是选择您发布的内容,然后单击编辑器工具栏中的代码示例按钮(带有
{ }图标的那个)。 -
架构和表应该正确引用
'GRANT VIEW CHANGE TRACKING ON ' + QUOTENAME(@SchName) + '.' + QUOTENAME(@TblName) + ' TO ' + QUOTENAME(@newgrp)
标签: sql-server-2016