我有一个有 5 列的表:
username(varchar)password(int)access(bit)information(varchar)image(varchar)
我想阻止用户插入 2 列information和imageif access = true。
无论如何使用插入触发器来做到这一点?任何帮助都会很棒。
我有一个有 5 列的表:
username( varchar)password( int)access( bit)information( varchar)image( varchar)我想阻止用户插入 2 列information和imageif 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