2014-04-25 111 views
1

我有Sybase版本10.0.1.3960和'繼承'非常大的數據庫。我試圖授予特權所有表到單個用戶。Sybase中的表太多,怎麼處理

問題是有很多的表,681表是準確的!

手動寫入查詢的表太多,所以我生成了sql的主動方式。麻煩的是,編程生成太長。 Sybase具有32767(2^15-1)的限制VARCHAR,並且查詢比這更長。我試着定義一個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

寫入它作爲一個循環爲每個表復位@payload。我不是遊標的忠實粉絲;但是這可能只是時間來使用它......或者將每個select寫出到臨時表中,然後從中選擇並遍歷每一行......這裏有很多選項。 – xQbert

+0

我寧願循環...只是因爲它很安靜直接向前;) – frlan

+0

你嘗試過使用'text'或'long nvarchar'嗎? –

回答

0

您可以爲這種情況創建一個遊標。 在cursot中,您可以生成一個控制長度爲字符串的已執行字符串。 例如,如果字符串的長度超過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