Stored-Procedures

將表名傳遞給儲存過程

  • April 3, 2017

創建新表後,我們必須執行相同的 SQL 程式碼段,該程式碼段授予某些使用者對該表的權限並進行類似的維護。此程式碼在所有情況下都是相同的,只是表名不同。

我想編寫一個儲存過程來將整個語句集抽象為一個儲存過程呼叫,但我不明白該怎麼做。例如,這是我創建的一個簡單的:

CREATE PROCEDURE dbo.spGrantTableRights
      @TableName varchar(255)
AS
BEGIN
   DECLARE @Name varchar(255)
   SELECT @Name = name
     FROM sysobjects
    WHERE name = @TableName

   GRANT SELECT            ON @Name TO mainUserName
   GRANT INSERT            ON @Name TO mainUserName
   GRANT DELETE            ON @Name TO mainUserName
   GRANT UPDATE            ON @Name TO mainUserName
   GRANT DELETE STATISTICS ON @Name TO mainUserName
   GRANT TRUNCATE TABLE    ON @Name TO mainUserName
   GRANT UPDATE STATISTICS ON @Name TO mainUserName
   GRANT TRANSFER TABLE    ON @Name TO mainUserName
END

但是傳遞一個字元串表名並沒有幫助——我沒有得到一個系統對象。如何將此字元串轉換為系統對象?或者有沒有更好的方法來完全做到這一點?

注意我知道動態 SQL 可以工作,但它使程式碼既醜陋又不可讀。在動態 SQL 框架之外是否有標準的方法來處理這個問題?

正如@Shaulinator 在他的回答中所說的那樣;實現這一點的唯一方法是使用動態 SQL。

話雖如此,我會告誡不要將“不要重複自己”的口頭禪過多地應用於它不一定屬於的數據庫程式碼。我知道您的問題是關於 Sybase ASE(現在是 SAP ASE);但是,由於 SQL Server 和 ASE 共享一種非常通用的語言,我將向您指出 Erland Sommarskog 的動態 SQL“聖經”,動態 SQL 的詛咒和祝福

我建議您模板化您的權限程式碼,以便您在添加新對象時對對象名稱進行搜尋和替換。在您的版本控制系統中保留修改後的模板程式碼;很可能與目標程式碼本身在同一個地方。

引用自:https://dba.stackexchange.com/questions/168973