web-dev-qa-db-ja.com

ストアドプロシージャにテーブル名を渡す

新しいテーブルが作成されたら、同じ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フレームワークの外部でこの問題に対処する標準的な方法はありますか?

1
gt6989b

@Shaulinatorが彼の答えで述べたように;これを実現する唯一の方法は、動的SQLを使用することです。

そうは言っても、必ずしも所属しているとは限らないデータベースコードに、自分自身を繰り返さないというマントラを過度に適用しないように注意します。あなたの質問はSybaseASE(現在はSAP ASE)に関するものだと思います。ただし、SQL ServerとASEは非常に共通の言語を共有しているため、ErlandSommarskogによる動的SQLの「聖書」を紹介します。 動的SQLの呪いと祝福

新しいオブジェクトを追加するたびにオブジェクト名を検索して置換するように、アクセス許可コードをテンプレート化することをお勧めします。変更したテンプレートコードをバージョン管理システムに保持します。ほとんどの場合、オブジェクトコード自体と同じ場所にあります。

2
Max Vernon