我有5列的表格:如何使用插入觸發器禁用某些列?
username
(varchar
)password
(int
)access
(bit
)information
(varchar
)image
(varchar
)
我想阻止用戶插入到2列information
和image
如果access = true
。
無論如何要做到這一點使用插入觸發器?任何幫助都會很棒。
我有5列的表格:如何使用插入觸發器禁用某些列?
username
(varchar
)password
(int
)access
(bit
)information
(varchar
)image
(varchar
)我想阻止用戶插入到2列information
和image
如果access = true
。
無論如何要做到這一點使用插入觸發器?任何幫助都會很棒。
使用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
會導致兩行被保存到數據庫表中,但插入第二行會有空information
和image
列.. 。
,如果你在插入需要這種行爲進行簡單的檢查約束可能足以或更新:
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