2015-08-14 38 views
0

如何在其他表中使用varchar前綴引用自動增加的ID?我希望我的用戶能夠與帶有前綴ED1501,而不是他們EmpNumber爲1如何在其他表中使用varchar前綴引用自動增加的ID

CREATE TABLE Employee 
(
EmpNumber int identity (1, 1), 
Id as 'ED15'+right('00'+cast(EmpNumber as varchar(2)), 2) persisted, 
EmpImage varchar(200), 
TitleID int FOREIGN KEY REFERENCES Title(TitleID), 
EmpTypeID int FOREIGN KEY REFERENCES EmployeeType(EmpTypeID), 
PositionID int FOREIGN KEY REFERENCES Position(PositionID)NULL, 
EmpName varchar (50), 
EmpSurname varchar (50), 
EmpDOB date, 
EmpID_PassportNumber varchar (13), 
EmpEmail varchar(255), 
CountryID int FOREIGN KEY REFERENCES Country(CountryID), 
ProvinceID int FOREIGN KEY REFERENCES Province(ProvinceID), 
City varchar(50), 
Suburb varchar (50), 
Street varchar (50), 
PostalCode varchar (4), 
BankID int FOREIGN KEY REFERENCES Bank(BankID), 
AccountNumber varchar (20), 
TaxNumber varchar (20), 
Salary float, 
WorkingHours int, 
constraint PK_Employee primary key (EmpNumber) 
); 
GO 

CREATE TABLE LoginDetails 
(
EmpNumber int FOREIGN KEY REFERENCES Employee(EmpNumber), 
[Password] varchar(8), 
SecurityQuestion varchar(50), 
SecurityAnswer varchar(20) 
); 
GO 

目前我使用的EmpNumber我得到的數據類型錯誤引用,當我嘗試引用編號登錄與這是varchar的Id。我想知道,因爲當我移動到設計表示層時,我希望用戶輸入他們的ID和密碼而不是他們的EmpNumber。

+1

這不是mysql語法。在mysql中沒有'identity',並且不能將字段定義爲表達式的結果。 –

回答

0

不可能創建從X <一個Declarative Referential Integrity (DRI)關係 - >Y + X在標準SQL;儘管在查詢這樣的關係時在技術上沒有問題。

主要和外部列必須共享DRI的相同值。額外的Z = Y + X字段可以創建爲Z <→Z DRI關聯;但重要的是要注意源和目標(在引入冗餘密鑰之後)匹配。

無論如何,雖然以上是針對'標題問題',但它可能與「我希望我的用戶能夠使用Id登錄」無關。要解決這個問題,只需更新'身份驗證檢查'查詢 - ,並在EmpNumber上加入 - 將該字段用作登錄委託人;這個任務本身不需要用「ED1」ID建立DRI,並且只有EmpNumber列的FK關係設置。


此字段通常必須在應用嵌件層來處理或插入件代替-的觸發。即使SQL Server甚至支持持久計算的列,仍然是does not allow computed columns to be used in DRI

例如:

select .. 
from Employees e 
join LoginDetails ld 
    on e.EmpNumber = ld.EmpNumber  -- this is the Relationship: X <-> X 
where e.Id = @theIdWithED1Prepended 
    and ld.password = @thePassword 

此外,使用VARCHAR(8)是 '錯誤' 的,因爲

  1. 它絕對不是一個正確哈希/鹽醃密碼 - 平原應避免文本密碼存儲;和
  2. 無論如何,密碼應該被鼓勵爲更長的通行短語 - 沒有理由過時的8個字符的限制。
0

伊夫想通了一切,我不得不被拷貝的Id

Id as 'ED15'+right('00'+cast(EmpNumber as varchar(2)), 2) persisted, 

進入LoginDetails表FORIEGN KEY參考

EmpNumber int FOREIGN KEY REFERENCES Employee(EmpNumber), 

然後使用Visual Studio中的下列select語句下現在我可以登錄使用ED1501而不是1

string sql= "select * FROM LoginDetails WHERE Id = '" + txtEmpNumber.Text + "' AND Password = '" + txtPassword.Text + "' "; 

謝謝大家的幫助我真的很感激!

+0

或者你可以使用一個不重複的數據,但無論如何。無論如何,請*修復* [SQL注入](https://en.wikipedia.org/wiki/SQL_injection)容易出錯的代碼。 – user2864740

相關問題