2013-10-13 57 views
1

我有5列的表格:如何使用插入觸發器禁用某些列?

  • usernamevarchar
  • passwordint
  • accessbit
  • informationvarchar
  • imagevarchar

我想阻止用戶插入到2列informationimage如果access = true

無論如何要做到這一點使用插入觸發器?任何幫助都會很棒。

回答

0

使用INSTEAD OF INSERT trigger,您可以輕鬆「過濾」不需要的信息,例如如果插入一行access = 0

CREATE TRIGGER InsteadTrigger on dbo.YourTableNameHere 
INSTEAD OF INSERT 
AS 
BEGIN 
    INSERT INTO dbo.YourTableNameHere(username, password, access, information, image) 
     SELECT 
      username, password, access, 
      CASE access 
       WHEN 1 THEN '' ELSE i.information END, 
      CASE access 
       WHEN 1 THEN '' ELSE i.image END 
     FROM INSERTED i 
END; 

所以 - 所呈現的所有列獲取存儲:你可以插入的情況下,一個空字符串(或別的東西),其access設置爲1

因此,如果您嘗試插入一行access = 1 - 列「information」和「image」正在被「清除」並且存儲空字符串。

在SQL Server上和更新,這在此處插入:

INSERT INTO dbo.YourTableNameHere(username, password,access,information, image) 
VALUES ('test 1', 42, 0, 'testinfo 1', 'testimg 1'), 
     ('test 2', 4711, 1, 'testinfo 2', 'testimg2') 

SELECT * FROM dbo.YourTableNameHere 

會導致兩行被保存到數據庫表中,但插入第二行會有空informationimage列.. 。

0

,如果你在插入需要這種行爲進行簡單的檢查約束可能足以或更新

ALTER TABLE MySchema.MyTable 
ADD CONSTRAINT CK_MyTable_BlockInformationImageWhenAccessIsTrue 
CHECK(access = 1 AND information IS NULL AND image IS NULL OR access = 0); 

如果需要此行爲僅在插入的時刻,那麼你可以使用此觸發器:

CREATE TRIGGER trgI_MyTable_BlockInformationImageWhenAccessIsTrue 
ON MySchema.MyTable 
AFTER INSERT 
AS 
BEGIN 
    IF EXISTS 
    (
     SELECT * 
     FROM inserted i 
     WHERE i.access = 1 
     AND (information IS NOT NULL OR image IS NOT NULL) 
    ) 
    BEGIN 
    ROLLBACK TRANSACTION; 
    RAISERROR('Access denied', 16, 1); 
    END 
END; 
GO