Sybase中的表太多,如何应对

时间:2014-04-25 19:51:58

标签: sql sybase grant database-table

我有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 )

1 个答案:

答案 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