新しいテーブルが作成されたら、同じSQLコードセグメントを実行する必要があります。これにより、一部のユーザーにテーブルへの権限が付与され、同様のメンテナンスが行われます。このコードはすべての場合で同一であり、テーブル名のみが異なります。
ステートメントのセット全体を1つのストアドプロシージャ呼び出しに抽象化するストアドプロシージャを作成したかったのですが、その方法がわかりません。たとえば、これは私が作成した簡単なものです。
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を使用することです。
そうは言っても、必ずしも所属しているとは限らないデータベースコードに、自分自身を繰り返さないというマントラを過度に適用しないように注意します。あなたの質問はSybaseASE(現在はSAP ASE)に関するものだと思います。ただし、SQL ServerとASEは非常に共通の言語を共有しているため、ErlandSommarskogによる動的SQLの「聖書」を紹介します。 動的SQLの呪いと祝福
新しいオブジェクトを追加するたびにオブジェクト名を検索して置換するように、アクセス許可コードをテンプレート化することをお勧めします。変更したテンプレートコードをバージョン管理システムに保持します。ほとんどの場合、オブジェクトコード自体と同じ場所にあります。