我的数据库中有一个Employee表。值通过asp.net页面插入到此表中。我想在Employee insert上创建一个触发器,只有当用户具有" id = 1110"时才允许插入,必须拒绝所有其他用户插入。我不知道如何将userid作为参数传递给触发器。有人可以帮我吗???
答案 0 :(得分:0)
创建触发器后,您可以在c#代码中调用下面的存储过程:
--table|start
CREATE TABLE dbo.z_Employee (ID INT IDENTITY(1, 1), Name VARCHAR(100), UserModify SMALLINT)
--table|end
--stored procedure for inserting new employee|start
CREATE PROC dbo.z_AddEmployee(@Name VARCHAR(100), @UserModify SMALLINT)
AS
--for debugging|start
--DECLARE @Name VARCHAR(100)
-- , @UserModify SMALLINT = 1112
--for debugging|end
INSERT dbo.z_Employee (Name, UserModify)
VALUES (@Name, @UserModify)
--for debugging|start
--SELECT e.*
--FROM dbo.z_Employee e WITH(NOLOCK)
--for debugging|end
--stored procedure for inserting new employee|end
--trigger for disallowing inserts|start
CREATE TRIGGER dbo.z_DoNotAllowOtherUser
ON dbo.z_Employee
FOR INSERT
AS
IF EXISTS
(SELECT TOP 1 i.ID
FROM INSERTED i
WHERE i.UserModify <> 1110)
BEGIN
DELETE e
FROM dbo.z_Employee e WITH(NOLOCK)
JOIN INSERTED i ON i.ID = e.ID
END
--trigger for disallowing inserts|end
答案 1 :(得分:0)
触发器无法传递参数 - 您必须在数据库操作中操作。因此,除非Employee表具有引用进行更改的用户的id的CreateBy或LastUpdateBy,否则您需要将INSERT包装到执行该检查之前执行该检查的存储过程。
如果您的Employee表有一个CreateBy包含执行更改的用户的id,那么下面的触发器应该有效:
CREATE TRIGGER tg_Employees_RegisterAdminOnly ON dbo.Employees
AFTER INSERT AS
BEGIN
IF EXISTS (SELECT * FROM INSERTED WHERE CreateBy <> 1110) BEGIN
RAISERROR('Unauthorized registration', 16, 1)
ROLLBACK
RETURN
END
END
GO