0

我在SQL Server中有一個UPDATE語句,它運行幾個UDF來封裝必要的業務邏輯。因此,用戶可以選擇加入或選擇退出與我們公司的通信,並且我們擁有許多與我們發送人員通信相對應的許可代碼。我們不僅擁有權限字段,而且還有一個不提升字段。如果有人選擇退出權限,那麼我們希望將其及其關聯的權限移至DNP字段。UDF字段參考在SQL Server UPDATE語句

因此,可以說,用戶有以下字段值

PermissionCodes    DoNotPromoteCode 
A|B|C|D|      Z| 

現在用戶選擇出的,但是當他選擇出來的,然後我們公司希望選擇他出去碼C和G,以及並將這些值添加到DoNotPromote字段中,但只有將它們添加到DNP(如果它們位於權限字段中)。即

PermissionCodes    DoNotPromoteCode 
B|D|       Z|A|C| 

所以我有這個疑問:

UPDATE Permissions 
SET PermissionCodes = dbo.RemovePermissions('A'), 
    DoNotPromoteCodes = dbo.AddDoNotPromote('A', PermissionCodes) 
WHERE Email = '[email protected]' 

的UDF「dbo.RemovePermissions」將刪除您通過在權限和相關的所有其他權限。 UDF「dbo.AddDoNotPromote」將權限添加到DoNotPromote字段,然後在PermissionCodes中搜索該代碼的親屬,並將它們添加到DoNotPromote字段中。因此,我的問題是,因爲我在更新PermissionCodes字段的同時,在dbo.AddDoNotPromte UDF中引用它,所以在更新語句期間,在dbo.AddDoNotPromote UDF中讀取PermissionCodes字段?到目前爲止,我得到了我期待的結果,但是它總是保證dbo.AddDoNotPromote將在dbo.RemovePermissions刪除這些值之前讀取PermissionCodes字段中的值?

回答

0

要真正回答你的問題,它始終是所使用的更新前的值,因此該表:

A | B 
----+----- 
1 | 2 
3 | 4 

運行:

UPDATE T 
SET  A = B, 
     B = 1; 

會給:

A | B 
----+----- 
2 | 1 
4 | 3   

它不按更新中的語句順序運行。

但是,如果還不算太晚,你應該認真考慮重新設計你的表格,在文本列中存儲分隔值是一個可怕的想法。

你會好得多存儲在規範化的表格數據,所以你有一個像表結構:

PermissionCode

PermissionCode 
------- 
A    
B    
C 
D 
Z 

UserPermission

UserID | PermissionCode 
--------+-------------------- 
1  | A 
1  | B 
1  | C 
1  | D 

然後,您可以使用另一個表來管理鏈接的權限:

ParentCode | ChildCode 
------------+--------------- 
    A  |  C 
    A  |  G 

然後,您可以使用此表獲得用戶的所有權限,例如,通過創建一個視圖:

CREATE VIEW dbo.AllUserPermission 
AS 
SELECT p.UserID, p.PermissionCode 
FROM UserPermission p 
UNION 
SELECT p.UserID, lp.ChildCode 
FROM UserPermission p 
     INNER JOIN LinkedPermission lp 
      ON lp.ParentCode = p.PermissionCode; 

然後你就可以得到權限用戶沒有使用這樣的事情:

SELECT u.UserID, P.PermissionCode 
FROM UserTable u 
     CROSS JOIN PermissionCode p 
WHERE NOT EXISTS 
     ( SELECT 1 
      FROM AllUserPermission up 
      WHERE up.UserID = u.UserID 
      AND  up.PermissionCode = p.PermissionCode 
     ); 

這樣,當你添加新的權限,你不需要upate一個列的所有用戶DoNotPromoteCode,這是通過刪除用戶從所有權限列表中刪除權限來計算的。

如果您特別需要存儲人們除了未收到的代碼之外已經過期選擇的代碼,則可以在UserPermission表中添加一列以存儲此代碼,還可以存儲日期和時間以便您知道當採取各種行動時:

UserID | PermissionCode | AddedDateTime | DoNotPromoteDateTime | RemovedDateTime 
--------+-------------------+-------------------+---------------------------+-------------------- 
1  |  A   | 2013-11-25 16:55 |   NULL   |  NULL 
1  |  B   | 2013-11-25 16:55 |  2013-11-25 16:55 |  NULL 
1  |  C   | 2013-11-25 16:55 |  2013-11-25 16:56 | 2013-11-25 16:57 
1  |  D   | 2013-11-25 16:55 |   NULL   | 2013-11-25 16:57 

通過查詢某些列是否爲NULL,您可以確定各種狀態。

這是處理一個一對多的關係的一個更易於管理的方式,管道分隔字符串不會造成任何的問題,最後,如果你需要顯示的許可權代碼爲任何原因,這can be achieved using SQL Servers XML extensions

分隔字符串