hiểu chết liền
Có một bảng về sau về Transaction:
_Transaction_Id
_Transaction_Description
_Transaction_Date
Đơn giản vậy thôi ^^
Với yêu cầu:
_Transaction_id định dạng P[0-9][0-9][0-9] tự tăng
_Transaction_Description not null
_Transaction_Date mặc định là ngày hiện tại, khi không được nhập.
Gặp khó khăn![]()
_Cho tự tăng mình dùng 2 procedure, một cho tự tăng, và cái thứ 2 chỉ đến proc 1 để insert vào bảng.
_Khi cho chạy proc 2, thì lệnh default không thực hiện được (hiển nhiên rồi)
_Sửa dùng trigger, thì nó yêu cầu phải insert Transaction_Id, mà cái này tự tăng --> thất bại.
_Sửa proc để nó chấp nhận default, không được --> thất bại.
Có cách nào không? Chỉ mình với![]()
offline as always
hiểu chết liền
Sống ở trên đời cần có một TẤM LÒNG để lúc đói còn có chỗ mà nhét THỨC ĂN
HÌnh như đang nói về CSDL, mà chẳng biết nó là CSDL gì?
Bạn chú ý về Trigger nhé.Có một bảng về sau về Transaction:
_Transaction_Id
_Transaction_Description
_Transaction_Date
Đơn giản vậy thôi ^^
Với yêu cầu:
_Transaction_id định dạng P[0-9][0-9][0-9] tự tăng
_Transaction_Description not null
_Transaction_Date mặc định là ngày hiện tại, khi không được nhập.
Gặp khó khăn
_Cho tự tăng mình dùng 2 procedure, một cho tự tăng, và cái thứ 2 chỉ đến proc 1 để insert vào bảng.
_Khi cho chạy proc 2, thì lệnh default không thực hiện được (hiển nhiên rồi )
_Sửa dùng trigger, thì nó yêu cầu phải insert Transaction_Id, mà cái này tự tăng --> thất bại.
_Sửa proc để nó chấp nhận default, không được --> thất bại.
Ta chỉ sử dụng trigger khi mà các biện pháp bảo đảm data intergrity khác như Constraints không thể thỏa mãn yêu cầu của ứng dụng. Nên nhớ Constraint thuộc loại Declarative Data Integrity cho nên sẽ kiểm tra data trước khi cho phép nhập vào table trong khi Trigger thuộc loại Procedural Data Integrity nên việc insert, update, delete đã xảy ra rồi mới kích hoạt trigger. Chính vì vậy mà ta cần cân nhắc trước khi quyết định dùng loại nào trong việc đảm bảo Data Integrity
Còn vấn đề của bạn, chưa hiểu cái P[0-9][0-9][0-9] là cái gì bạn nói rõ thêm đi.
Àh, 2 cái procedure của bạn là sao? Bạn đưa lên đây cụ thể để biết mục đích của bạn là gì chứ? Mà nếu mình không lầm thì bạn phải gọi nó là stored procedure mới đúng chứ nhỉ.
Mà tại sao lại có cái sp thứ 2 trỏ vào 1 để làm gì? Sao không để cái sp 1 nó check trong Transaction_ID rồi nó tự động tăng lên?
Bạn redefine cái vấn đề rõ hơn chút nữa nhé.
Regards,
Đã được chỉnh sửa lần cuối bởi hung.tran : 04-12-2007 lúc 02:59 PM.
SQL SERVER 2000
- P[0-1][0-1][0-1] là định dạng đó bạn ^^
Tạo bảng ^^
Tự tăngCode:CREATE TABLE TRANSACTIONS ( cTRANSACTION_ID char(4) CONSTRAINT PKTRANSACTION_ID PRIMARY KEY, dTRANSACTION_DATE DATETIME default getdate(), cTRANSACTION_DESCRIPTION varchar(100) )
Code:create proc prcAutoGenerated_transaction @Auto char(4) output as select @Auto=max(cTRANSACTION_ID) from TRANSACTIONS if @Auto is null select @Auto='P001' else begin select @Auto=right(@Auto,3) select @Auto= case when @Auto>=0 and @Auto<9 then 'P00'+convert(char,@Auto+1) when @Auto>=9 and @Auto<99 then 'P0'+convert(char,@Auto+1) when @Auto>=99 and @Auto<999 then 'P'+convert(char,@Auto+1) end end return go create proc prcAutoDetail_transaction @dTRANSACTION_DATE DATETIME, @cTRANSACTION_DESCRIPTION varchar(100) as declare @Auto char(4) exec proc prcAutoGenerated_transaction @Auto output insert into TRANSACTIONS values (@Auto,@dTRANSACTION_DATE,@cTRANSACTION_DESCRIPTION)
offline as always