我有一个有 5 列的表:
username
(varchar
)password
(int
)access
(bit
)information
(varchar
)image
(varchar
)
我想阻止用户插入 2 列information
和image
if access = true
。
无论如何使用插入触发器来做到这一点?任何帮助都会很棒。
我有一个有 5 列的表:
username
( varchar
)password
( int
)access
( bit
)information
( varchar
)image
( varchar
)我想阻止用户插入 2 列information
和image
if access = true
。
无论如何使用插入触发器来做到这一点?任何帮助都会很棒。
使用INSTEAD OF INSERT
触发器,您可以轻松地“过滤掉”不需要的信息,例如,您可以插入一个空字符串(或其他内容)以防access
设置为1
:
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 = 0
- 所有列都会按呈现方式存储。
因此,如果您尝试插入带有access = 1
- 列的行,information
并且image
正在“清除”并存储一个空字符串。
在 SQL Server 2008及更高版本上,此处插入:
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
列...
如果您在插入或更新时需要此行为,一个简单的 CHECK 约束就足够了:
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