有没有办法使用约束来避免在特定表上删除行?
如果id为0,1或2
,我想(例如)拒绝删除行这是为了避免用户删除某个应用程序的主帐户,即使有人(直接使用sql)直接尝试使用sql,我也想避免使用它。
谢谢!
修改
这个问题的整个想法不是触及应用程序。这不是安全问题,我只需要知道是否可以使用约束或SQL Server所具有的任何其他东西来执行我所要求的(它不需要是标准的数据库解决方案)。
编辑2:
非常非常感谢代码示例:D
答案 0 :(得分:10)
至于在约束中强制执行此操作,我的解决方案是创建一个从属表,因此无法删除引用的行。
CREATE TABLE NoKillI (
id INT NOT NULL, FOREIGN KEY (id) REFERENCES Accounts(id) ON DELETE RESTRICT
);
INSERT INTO NoKillI (id) VALUES (0);
INSERT INTO NoKillI (id) VALUES (1);
INSERT INTO NoKillI (id) VALUES (2);
现在没有人可以删除id为0,1或2的Accounts
中的行,除非他们首先删除NoKillI
中的相应行。您可以使用SQL权限限制对依赖表的删除。
答案 1 :(得分:5)
您可以通过编写针对相关表格的DELETE触发的数据库触发器来执行此操作。如果ID无效,它需要做的就是抛出异常。
答案 2 :(得分:3)
如果您不信任您的用户,请添加安全性。
话虽如此,如果您的用户有足够的访问权限通过SQL与您的数据库通信,那么您真的只是在寻找麻烦。您应该加强安全性,并且只允许通过您的应用程序和已建立的协议访问数据库。那么你有很多选择可以避免这样的问题。
答案 3 :(得分:1)
我正在使用以下触发器:
CREATE TRIGGER [dbo].[mytable_trd] ON [dbo].[mytable]
WITH EXECUTE AS CALLER
INSTEAD OF DELETE
AS
BEGIN
SET NOCOUNT ON
DECLARE @tn varchar(255)
SELECT @tn = object_name(parent_obj)
FROM sysobjects
WHERE id = @@procid;
SET @tn = 'Deletes not allowed for this table: ' + @tn;
-- Add your code for checking the values from deleted
IF EXISTS(select * from deleted where mycolumn = 1)
RAISERROR (@tn, 16, 1)
END
GO
答案 4 :(得分:0)
你确定你永远不会希望任何人删除这些行吗?甚至你自己,还是dba?还是dbms维护工作?
如果它只是某些用户,那么您需要具有权限的用户表,以便可以在触发器中查询它以区分未授权用户和授权用户。
答案 5 :(得分:0)
我更喜欢的解决方案使用关系模型及其完整性规则。
对于Tbl_Account
中无法删除的每条记录,我会在Tbl_AccountMaster
中添加一条记录,其中Tbl_Account.id_Account
是外键。除了数据库管理员之外,Tbl_AccountMaster
不可用于更新。然后,其他任何人都无法删除与Tbl_Account
链接的Tbl_AccountMaster
的记录。
答案 6 :(得分:-1)
您可以尝试使用检查以确保用户不会尝试删除您的主帐户的功能来过滤您的查询。