Stored-Procedures
將表名傳遞給儲存過程
創建新表後,我們必須執行相同的 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 的詛咒和祝福
我建議您模板化您的權限程式碼,以便您在添加新對象時對對象名稱進行搜尋和替換。在您的版本控制系統中保留修改後的模板程式碼;很可能與目標程式碼本身在同一個地方。