我有Sybase版本10.0.1.3960和'继承'非常大的数据库。我正在尝试将所有表的SELECT
权限授予单个用户。
问题在于 很多 表,确切地说是681个表!
手动编写查询的表太多,所以我以progamatically方式生成了sql。问题在于编程生成的时间太长。 Sybase的VARCHAR
限制为32767(2 ^ 15-1),查询时长。我尝试定义LONG VARCHAR
,但我一直收到错误。
我的绳子结束了,我该怎样才能做到这一点?
DECLARE @login VARCHAR(255)
DECLARE @payload VARCHAR(32765) -- <-- too few characters, too many tables
SELECT @login = 'myUserLogin'
SELECT @payload = Result.Payload FROM (
SELECT LIST(tbl.ApplicableAsset, ';\n') AS 'Payload'
From (
SELECT 'GRANT SELECT ON ' + name + ' TO ' + @login +'' AS 'ApplicableAsset'
FROM sysobjects
WHERE type='U'
) AS tbl
) AS Result
EXECUTE ( @payload )
答案 0 :(得分:0)
您可以为此案例创建游标。 在cursot中,您可以生成一个控制长度为string的已执行字符串。 例如,如果字符串的长度大于2000 sym - 您可以执行此字符串并开始生成新字符串。
例如,它可以是:
Decalre Cur Cursor for select One_Grant_Expression from ....
go
Open Cur
Declare @SQLText varchar(8000)
Declare @OneText varchar(1000)
fetch Cur into @OneTExt
while (@@sqlstatus = 0) do
begin
Set @SQLText = @SQLText + @OneText
if Length(@SQLText) > 2000
begin
exec (@SQLText)
Set @SQLText = ''
end
fetch Cur into @OneTExt
end
If Length(@SQLText) > 0 begin exec (@SQLText) end
Close Cur
go