You can try using trigger INSTEAD OF (but be careful...). Another way can be to build a stored procedure to make or not insert/update, and call the stored procedure from application.
Just for example (should be completed with check, error try, etc.):
CREATE TABLE T1 (ID int NOT NULL, field1 int, field2 int);
ALTER TABLE T1 ADD CONSTRAINT T1_PK PRIMARY KEY(ID);
GO
CREATE TRIGGER T1_TRG_INS ON T1
INSTEAD OF INSERT
AS
BEGIN
IF EXISTS (SELECT 1 FROM inserted i WHERE (i.field1 IS NULL AND i.field2 IS NULL) OR (i.field1 IS NOT NULL AND i.field2 IS NOT NULL))
BEGIN
PRINT 'Data error. No data inserted.'
END
ELSE BEGIN
INSERT INTO T1 (ID, field1, field2) SELECT ID, field1, field2 FROM inserted
END
END
GO
CREATE TRIGGER T1_TRG_UPD ON T1
INSTEAD OF UPDATE
AS
BEGIN
IF EXISTS (SELECT 1 FROM inserted i WHERE (i.field1 IS NULL AND i.field2 IS NULL) OR (i.field1 IS NOT NULL AND i.field2 IS NOT NULL))
BEGIN
PRINT 'Data error. No data updated.'
END
ELSE BEGIN
UPDATE T1 SET field1=i.field1, field2=i.field2
FROM inserted i WHERE T1.ID = i.ID
END
END
GO
----testing-----
SELECT * FROM T1
INSERT INTO T1 (ID, field1, field2) VALUES (1, NULL, NULL); -- NOT inserted
INSERT INTO T1 (ID, field1, field2) VALUES (2, NULL, 1); -- inserted
INSERT INTO T1 (ID, field1, field2) VALUES (3, 1, NULL); -- inserted
INSERT INTO T1 (ID, field1, field2) VALUES (4, 1, 1); -- NOT inserted
UPDATE T1 SET field1 = 1 WHERE ID=2 -- not updated
UPDATE T1 SET field2 = 2 WHERE ID=2 -- updated
UPDATE T1 SET field1 = NULL, field2=3 WHERE ID=2 -- updated
UPDATE T1 SET field1 = 4, field2=NULL WHERE ID=2 -- updated
UPDATE T1 SET field1 = 4, field2=5 WHERE ID=2 -- not updated
您將需要在MS Access中使用VBA。嘗試BeforeUpdate事件。 – Fionnuala