0

オブジェクトが存在するかどうかを判断するために、最初にそのユーザーとして sysobjects をクエリして、特定のユーザーに対して SQL でスキーマの変更を実行しようとするレガシー システムを使用しています。存在する場合は ALTER VIEW ステートメントを作成し、そうでない場合は CREATE VIEW ステートメントを作成します。この場合、ビューは存在しますが、クエリは引き続きオブジェクトの一覧表示に失敗します。

例えば:

setuser 'APPLICATION_DEV'
Select * from sysobjects o, sysusers u
where u.uid = o.uid 
and u.name = N'APPLICATION_DEV'

問題は、このデータベース内の特定のアカウントがエラーなしでこのクエリを実行でき、そのユーザーが所有するすべてのオブジェクトを返すことです。ただし、他のアカウントは、このクエリによって返されるレコードを取得しません。ユーザーを SA に設定してクエリを実行すると、すべてのユーザー オブジェクトが表示されます。影響を受けるユーザーはスキーマの所有者であり、スキーマに対するビューの作成権限を持っています。作業中のユーザー アカウントと非作業中のユーザー アカウントの間で権限の違いを見つけることができません。

ユーザーがsysobjectsで自分のオブジェクトを照会することを制限する、私が見逃している権限はありますか?

はい、sysobjects が廃止されたことは承知していますが、ここで実際のコードを制御することはできず、代わりにデータベースを修正して、コードが期待どおりに機能するようにする必要があります。

編集:追加の調査結果。問題を複雑にするために、これを正常に実行できます。

setuser 'APPLICATION_DEV'
Select * from sysusers
Where name = 'APPLICATION_DEV'

これも正常に実行できます。

setuser 'APPLICATION_DEV'
Select * from sysobjects
Where uid = 308 --308 is the uid of the APPLICATION_DEV user

ただし、where 句または INNER JOIN を介して結合を使用すると、レコードが取得されません。純粋に結合に基づいてレコードへのアクセスを制限するものは何ですか? インデックスの権限?? 私は困惑しています。

4

1 に答える 1

0

ユーザーマッピングの特定のユーザーについて、db_denydatareaderとdb_denydatawriter以外のすべてのチェックボックスをオンにしたかどうかを確認します。

これも確認してください
。オブジェクト'sysobjects'、データベース'mssqlsystemresource'、スキーマ'sys'でSELECT権限が拒否されました
http://social.msdn.microsoft.com/Forums/en/sqlsecurity/thread/a2befd20-2a9b-4a60- 95a9-3a80a1a99ea1

于 2013-01-08T15:25:54.287 に答える