0

私は3つのテーブルを持つデータベースを持っています:

表 1 (部門) - これは、部門と部門 ID の列を含む表です。

表 2 (SecurityMap) - これは、役割名を部門 ID にマップする表です。

表 3 (顧客情報) - これは、ロール メンバーシップに基づいてユーザーに表示される情報です。

役割関数に基づくすべての SELECT が機能しています。

必要なのは、ユーザー ロール メンバーシップに基づいて、既定で表 3 内の DepartmentID 列に特定の値を挿入する方法を理解することです。たとえば、誰かがデータベースに新しい行を追加する場合、「追加」フォーム内で提供するデータに加えて、この列にデフォルト値を挿入する必要があります。マーケティング ロールのメンバーである場合は 1、IT ロールのメンバーである場合は 2 などです。

理想的には、これは、ユーザーがそれが起こっていることさえ知らずに行われます。「代わりに」トリガーを使用する必要があると思いますが、続行する方法がわかりません....

4

2 に答える 2

0

難しすぎてはいけません:

  1. アプリで、ログインしているユーザーとその役割を追跡します。
  2. アプリが顧客データを保存するときは、ロール ID とユーザーが入力したデータをデータベースに渡すようにしてください (ここではストアド プロシージャが理想的です)。
  3. データベースは、提供されたデータを処理するときに、ロール ID を適切な列に保存します。
于 2013-05-01T15:10:39.743 に答える
0

rolename-column (または id) が securityMap-table で一意である場合、これは機能するはずです。そうでない場合、select は複数の値を返す可能性があります。その場合、departmentId を別の方法で選択する必要があるかもしれません。

insert into customer_info(otherdata, departmentId) values('data', (select departmentId from securityMap where rolename = 'userrole'))

編集:

db_owner について言及したので、これが役立つかもしれません ( http://www.sqlservercentral.com/Forums/Topic411310-338-1.aspxから)

WITH CTE_Roles (role_principal_id)
AS
(
SELECT role_principal_id 
FROM sys.database_role_members
WHERE member_principal_id = USER_ID()
UNION ALL
SELECT drm.role_principal_id
FROM sys.database_role_members drm
  INNER JOIN CTE_Roles CR
    ON drm.member_principal_id = CR.role_principal_id
)
SELECT USER_NAME(role_principal_id) RoleName
FROM CTE_Roles
ORDER BY RoleName;

これを SecurityMap テーブルと結合して、db_owner などのロールを除外することができます

于 2013-05-01T15:15:05.473 に答える